【发布时间】:2010-10-14 02:03:39
【问题描述】:
我需要实现方法:
object GetFactory(Type type);
此方法需要返回一个 Func
所以,我的问题是我不知道如何在运行时使用反射创建 Func>。 Activator.CreateInstance 不起作用,因为委托上没有构造函数。
有什么想法吗?
【问题讨论】:
标签: c# .net reflection
我需要实现方法:
object GetFactory(Type type);
此方法需要返回一个 Func
所以,我的问题是我不知道如何在运行时使用反射创建 Func>。 Activator.CreateInstance 不起作用,因为委托上没有构造函数。
有什么想法吗?
【问题讨论】:
标签: c# .net reflection
您使用Delegate.CreateDelegate,即来自MethodInfo;下面,我已经硬编码了,但是你会使用一些逻辑,或者Expression,来获得实际的创建方法:
using System;
using System.Reflection;
class Foo {}
static class Program
{
static Func<T> GetFactory<T>()
{
return (Func<T>)GetFactory(typeof(T));
}
static object GetFactory(Type type)
{
Type funcType = typeof(Func<>).MakeGenericType(type);
MethodInfo method = typeof(Program).GetMethod("CreateFoo",
BindingFlags.NonPublic | BindingFlags.Static);
return Delegate.CreateDelegate(funcType, method);
}
static Foo CreateFoo() { return new Foo(); }
static void Main()
{
Func<Foo> factory = GetFactory<Foo>();
Foo foo = factory();
}
}
对于非静态方法,有一个接受目标实例的Delegate.CreateDelegate 的重载。
【讨论】:
我认为通常的方法是让“哑”版本成为你在 runtme 上欺骗的东西,然后提供一个辅助扩展方法来提供类型安全的版本。
【讨论】:
您可以创建 Expression 对象而不是 func,然后 compile() 表达式以获得 Func 委托。
【讨论】:
我在 EF Core 中将它与泛型一起使用,包括制作 Expression
var someType = SomeDbContext.SomeDataModelExample.GetType();
var funcType1 = typeof(Func<>).MakeGenericType(new Type[] { someType });
var result = Activator.CreateInstance(funcType1);
var result2 = Activator.CreateInstance(funcType1, someParams);
【讨论】: