Create Property Setter Delegate Via DynamicMethod?
May 28, 2010
I'm building an abstract class that handles some common operations for all of my data access objects. The class will utilize generics, so I can't make direct calls to constructors, business object properties, etc. Reflection is way too slow for what I want to accomplish, so I am using a DynamicMethod, ILGenerator, and Delegate caching instead (sample will follow).
The method I'm currently working on is a Private Shared method that populates a list of business objects using records from a data table. I'm having a problem building the property setter via IL. I'm getting an object reference error, but I'm not sure how to fix it. I believe the error comes from the "target" being Nothing, but the parameter I'm passing as the target is not Nothing at the time of invocation. Here are some snippets of what I've got so far:
'class declaration -- TList is strongly-typed list of T
Public MustInherit Class DataAccessBase(Of T, TList)
...
'delegate declaration
[code]...
I'm assuming the obj is not being passed correctly as the target, thus causing the target to be Nothing.
I am trying to create a delegate(as a test) for: Public Overridable ReadOnly Property PropertyName()As String My intuitive attempt was declaring the delegate like this:
[code]...
So the question is, how do I make a delegate for a property?
Is there a way for implementers of an interface where a ReadOnly property is defined to make it a complete Read/Write Property ?
Imagine I define an interface to provide a ReadOnly Property (i.e., just a getter for a given value) :
Interface SomeInterface 'the interface only say that implementers must provide a value for reading ReadOnly Property PublicProperty As String End Interface
This means implementers must commit to providing a value. But I would like a given implementer to also allow setting that value. In my head, this would mean providing the Property's setter as part of the implementation, doing something like this :
Public Property PublicProperty As String Implements SomeInterface.PublicProperty Get Return _myProperty
I searched on the forum / Internet for the solution how a PropetryInfo object (of a Public property) can reveal if it has a Private Protected Setter ... it was all in vain .... all help I found was about how to "Set" value of a public property having a Private Setter.I would like to know if I have a PropertyInfo object of a public property, how would I know if its Setter is Non Public?
I tried, in a exception handling block, where I did a GetValue of the PropertyInfo object and then called SetValue by setting the same value back... but to my surprise it worked well and didn error out.
I've got 2 classes, one called row and one called value. The row class has an array of value as one of its properties. The row class also has a property called flag which will contain an enum for how it has changed. On the setter for value I was hoping to update the flag property of row, but I cant work out how to do it via modern OO. Here's the
Public Class Row 'Variables Private values_local() As Value Private flag_local As DataFlags 'Properties Property values() As Value() .....
I have issue with a Nhibernate projection list, It keeps saying it Could not find a setter for property 'Commname' in class 'Label6.Domain.Product' or could not resolve property "pl.commname" the property "commname" is a part of the object productslangs.
My product object looks like this: Public Overridable Property Latinname() As System.String Get Return _Latinname End Get Set(ByVal value As System.String) [Code] .....
This code snippet was converted from the c# snippet on this link A ChildWindow management service for MVVM applications There are two classes in this snippet first is my confirmessage class
[Code]...
Now this works fine in C# , however in vb,net the line where I add the event handler generates the following error on the message.callback property : Property access must assign to the property or use its value I am tearing out my hair on this I have never used the Action of T delegate before so could i be missing something simeple ? I can provide the c# code as well.
I am trying to test that a property has been set but when I write this as a unit test: moqFeed.VerifySet(Function(m) m.RowAdded = "Row Added") moq complains that "Expression is not a property setter invocation" My complete code is
This is a theoretical question, I've already got a solution to my problem that took me down a different path, but I think the question is still potentially interesting.Can I pass object properties as delegates in the same way I can with methods? For instance:
Let's say I've got a data reader loaded up with data, and each field's value needs to be passed into properties of differing types having been checked for DBNull. If attempting to get a single field, I might write something like:
from the documentation we have this: Multicast Delegate: Represents a multicast delegate; that is, a delegate that can have more than one element in its invocation list.
so am i right to say that Multicast delegate is no different from a normal delegate other than the fact that it has arguments. so System.Action is a 'normal' delegate whereas System.Action(T)(Byval obj as T) is a multicast delegate?
Code: Public Class SendPings Shared Sub New() AddHandler Post.Saved, AddressOf Post_Saved[code].....
I get a error" Method 'Private Shared Sub Ping(item As BlogEngine.Core.IPublishable, itemUrl As System.Uri)' does not have a signature compatible with delegate 'Delegate Sub WaitCallback(state As Object)'.
I have a function Process(data, f) where data is a normal parameter and f is a function needed to process the data (passed as a delegate to Process)
The signature of f is int f(a,b,c), with a, b, c supplied by Process when it calls the delegate.
Up until here, standard delegate usage.
Now, I have a special but common case where I would like to call Process with a constant f function. So I would like to write SimpleProcess(data, k) so that the caller does not need to create a delegate in this case, just pass the constant k (the only information needed).
So I need to dynamically create a constant function, g(a,b,c) which takes 3 parameters (which are ignored) and always returns k. This has to be done within the SimpleProcess function, so that I can then simply call Process(data, g) from within that function, without the need to rewrite the whole Process function for this special case.
Is there a way to create a delegate instance in .Net using CodeDom? I want to generate something which looks like the following:Dim myDelegate As someDelegateType = New someDelegateType(AddressOf implementingMethod)Below is more info on the context...Original Question:I am using CodeDom from the .Net framework (v3.5 if it matters) to generate a class. One of the classes defines a delegate method which in VB.Net looks like:Public Delegate Function filterByIdDelegate(ByVal obj As Object, ByVal id As Integer) As BooleanI then have a method which will provide the implementation:Private Function filterById(ByVal obj As Object, ByVal id As Integer) As Boolean Return (obj.ID = id)nd FunctionHere's the problem; how do you create an instance of the delegate (using the equivalent of AddressOf for VB.Net)? I am currently doing this (<filterByIdFunctionName> is a string holding the name of the delegate function, `' is the name of the delegate field):
Dim getFunction = New System.CodeDom.CodeMemberMethod() With getFunction 'Declare delegate instance
For a class, I have to create a delegate and use the function in my program called DoStuff(). There is an error tht says "Method 'Public Sub DoStuff(stringVal As String)' does not have a signature compatible with delegate 'Delegate Sub MyDel()'.
I have a code below to make collection that bind to a gridview able to sort by clicking on the column header. The problem here is "IPerson" is unknown at compile time. I want the delegate type able to decide by getting from gridview datasource.[code]....
I am trying to set a flag when a collection is modified - the logical place to do that seemed to be in the setter method. The problem is when I use this code
I created a getter and Setter in Visual Basic. I have some questions though. Please look at the code below.
A.) At line 1 below, should "pieces" be declared as Private?
B.) In the IDE at lines 4 and 7 the IDE keeps changing those variables to uppercase so that the property name "Pieces" is the same as the variable name "pieces".Should I instead define the integer pieces with an underscore: _pieces ?That is the only way I can get around the IDE forcing the variable to become uppercase. [code]
In my application I need to allow for someone to enter in a floating point value.However that value will be rounded up to an integer.The challenge here is that I am using a getter and setter.If I try and use mixed data types in the getter setter,[code..]
I am trying to write a VB.NET alternative to a C# anonymous function.I wish to call Threading.SynchronizationContext.Current.Send which expects a delegate of type Threading.SendOrPostCallback to be passed to it. The background is here, but because I wish to both pass in a string to MessageBox.Show and also capture the DialogResult I need to define another delegate within. I am struggling with the VB.NET syntax, both from the traditional delegate style, and lambda functions.My go at the traditional syntax is below, but I have gut feeling it should be much simpler than this:
Private Sub CollectMesssageBoxResultFromUserAsDelegate(ByVal messageToShow As String, ByRef wasCanceled As Boolean) wasCanceled = False
Private _myCollection As IList(Of T) Public Property MyProperty(Of T)() as IList(Of T) Get
[Code]....
Basically, I want to have a collection of items that may be of any type. Then, I'll be able to do something like this:
Dim myPropertyValue as <the type of some value> if (MyProperty.Contains(<some value>)) myPropertyValue = CType(MyProperty(<some value>), <the type of some value>)
How can I do this? Or is there a better way than using a generic type?
I am trying to create a property for objects, though I am not sure if that is what it is called. For example, PictureBox.Image instead of Image I want to use my own property.
I want to create a property handler in .NET. I have already implemented the IInitializeWithFile, IPropertyStore and IPropertyStoreCapabilities classes but I don't know how to implement their functions to create custom properties and display data.[url]...
I have class called "Employee" and I have a class called Department. They have an association. I need to create a colleciton of employees with the creation of a Departmant. I know how to do with using "private" member _AllMyEmployees. But I need to expose this private member using properties. therefore how do i covert thsi private member to a property? [code]