Peter van der Weerd <[EMAIL PROTECTED]> wrote:
> Suppose I typed the following delegate:
> public delegate void MyDelegate(int i);
>
> This delegate is only bindable to functions getting an int as a parameter.
Delegates are actually more flexible than the C# language permits. The
delegate above is also bindable to static methods taking both an object
and an int. The first parameter gets the value that was passed to
CreateDelegate as the object instance (and it can be any object).
---8<---
using System;
using System.Reflection;
class App
{
delegate void Foo(int x);
static void Main(string[] args)
{
MethodInfo myFoo = typeof(App).GetMethod("MyFoo",
BindingFlags.Static | BindingFlags.NonPublic);
Foo foo = (Foo) Delegate.CreateDelegate(typeof(Foo), null,
myFoo);
foo(42);
}
static void MyFoo(object obj, int x)
{
Console.WriteLine("obj is null: " + (obj == null));
Console.WriteLine("x: " + x);
}
}
--->8---
> My question is: how can I get information to what type of functions a
> delegate can bind to.
> Basically I want to write a function which accepts a typeof(MyDelegate) and
> is able to check if the MemberInfo of a method is bindable to this delegate.
You've got all the information in the MethodInfo (parameter and return
types) and in the delegate (find the Invoke method on the delegate type
and look at its parameter and return types). The rules:
* Return type on the method to bind can be covariant, or more derived
than the original in the delegate.
* Parameter types on the method to bind can be contravariant, or less
derived than the original in the delegate.
* Value types can't be coerced to reference types, so co/contravariance
doesn't apply between int and object, for example. In other words,
delegate dispatch never performs boxing or unboxing after the arguments
have been converted to match the declared parameter types on the
delegate.
* A static method can optionally accept a reference argument from the
delegate's "Target" property as the value of the first parameter. The
value of the argument to CreateDelegate must be assignable to variables
of the declared type of the first parameter if you use this. Again, the
value passed to CreateDelegate may be a value type, but the parameter
cannot: it must be a reference type.
-- Barry
--
http://barrkel.blogspot.com/
===================================
This list is hosted by DevelopMentorĀ® http://www.develop.com
View archives and manage your subscription(s) at http://discuss.develop.com