在最简单的级别上,您设置它的方式与设置 int 属性的方式相同:
假设这个类:
public class MyClass
{
internal Action<object> Simple { get; set; }
}
设置属性:
var type = typeof(MyClass);
var action = new Action<object>((o) => Console.WriteLine("Invoked with {0}", o));
var obj = new MyClass();
type.GetProperty("Simple", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(obj, action);
如果委托包含不作为参数公开的类型,您仍然可以使用对象设置它,具体取决于协变/逆变。
假设类如下,使用Action<object> 设置属性仍然有效
public class MyClass
{
internal Action<Arg> Simple { get; set; }
}
internal class Arg { }
如果委托类型本身是内部的,您需要创建该内部委托类型的实例:
假设:
public class MyClass
{
internal Internal Simple { get; set; }
}
internal class Arg { }
internal delegate void Internal(Arg arg);
你可以使用:
var type = typeof(MyClass);
var prop = type.GetProperty("Simple", BindingFlags.NonPublic | BindingFlags.Instance);
var action = new Action<object>((o) => Console.WriteLine("Invoked with {0}", o));
var delegateInsrtance = Delegate.CreateDelegate(prop.PropertyType, action.Target, action.Method);
var obj = new MyClass();
prop.SetValue(obj, delegateInsrtance);
注意:上述代码有效,因为我们创建了一个可以与Internal 委托兼容的委托(Action<object>)(参数不需要任何显式转换)并使用该委托的方法信息来创建新的内部委托。根据您要创建的委托的类型,这可能会更棘手,但如果没有更多信息,这个示例应该是一个很好的起点。