使用反射,我试图从无参数构造函数创建一个委托,如下所示:
Delegate del = GetMethodInfo( () => System.Activator.CreateInstance( type ) ).CreateDelegate( delType );
static MethodInfo GetMethodInfo( Expression<Func<object>> func )
{
return ((MethodCallExpression)func.Body).Method;
}
但是我得到了这个例外: “无法绑定到目标方法,因为其签名或安全透明性与委托类型的签名或安全透明度不兼容。”什么会起作用?
请注意,自上一版本的.NET以来,至少为此配置文件移动了CreateDelegate。现在它在MethodInfo上。
答案 0 :(得分:10)
正如phoog指出的那样,构造函数不会“返回”一个值;另外,您使用ConstructorInfo
而非MethodInfo
获取有关该信息的信息;这意味着你不能直接在它周围创建一个委托。您必须创建调用构造函数并返回值的代码。例如:
var ctor = type.GetConstructor(Type.EmptyTypes);
if (ctor == null) throw new MissingMethodException("There is no constructor without defined parameters for this object");
DynamicMethod dynamic = new DynamicMethod(string.Empty,
type,
Type.EmptyTypes,
type);
ILGenerator il = dynamic.GetILGenerator();
il.DeclareLocal(type);
il.Emit(OpCodes.Newobj, ctor);
il.Emit(OpCodes.Stloc_0);
il.Emit(OpCodes.Ldloc_0);
il.Emit(OpCodes.Ret);
var func = (Func<object>)dynamic.CreateDelegate(typeof(Func<object>));
当然,如果您在编译时不知道类型,那么您只能处理Object
...
答案 1 :(得分:2)
使用指向构造函数的委托是没有用的,因为构造函数没有返回值。委托会构造一个对象,但是你无法保留对它的引用。
您当然可以创建返回新构造对象的委托:
Func<object> theDelegate = () => new object();
您还可以使用构造函数Invoke()
ConstructorInfo
方法创建委托
对于其他类型的对象:
Func<string> theDelegate = () => new string('w', 3);
Func<SomeClassInMyProject> theDelegate = () => new SomeClassInMyProject();
最后一行假定有一个无参数的无参数构造函数。
使用CreateDelegate()
T CallConstructor<T>() where T : new() { return new T(); }
Delegate MakeTheDelegate(Type t)
{
MethodInfo generic = //use your favorite technique to get the MethodInfo for the CallConstructor method
MethodInfo constructed = generic.MakeGenericMethod(t);
Type delType = typeof(Func<>).MakeGenericType(t);
return constructed.CreateDelegate(delType);
}
答案 2 :(得分:0)
尝试一下:
Dictionary<Type, Delegate> cache = new Dictionary<Type, Delegate>();
public T Create<T>()
{
if (!cache.TryGetValue(typeof(T), out var d))
d = cache[typeof(T)]
= Expression.Lambda<Func<T>>(
Expression.New(typeof(T)),
Array.Empty<ParameterExpression>())
.Compile();
return ((Func<T>)d)();
}
反射很慢!速度测试(俄语):https://ru.stackoverflow.com/a/860921/218063