Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用运行时已知类型的泛型方法的快速方法_C#_Reflection - Fatal编程技术网

C# 调用运行时已知类型的泛型方法的快速方法

C# 调用运行时已知类型的泛型方法的快速方法,c#,reflection,C#,Reflection,我正在创建一些我在编译时不知道的类型实例。对于这种方法,我搜索了另一种方法,然后使用Activator.CreateInstance,因为在开发过程中实例的数量可能会大幅增加。我找到了快速创建这些实例的帖子。我唯一的问题是,我不知道编译时创建实例的实际类型。当然,我可以使用MethodInfo.MakeGenericMethod(myType)然后使用method.Invoke来调用接收到的方法。但正如我在前面提到的文章中所读到的,对构造函数调用Invoke需要花费很多时间,所以我想知道这是否也

我正在创建一些我在编译时不知道的类型实例。对于这种方法,我搜索了另一种方法,然后使用
Activator.CreateInstance
,因为在开发过程中实例的数量可能会大幅增加。我找到了快速创建这些实例的帖子。我唯一的问题是,我不知道编译时创建实例的实际类型。当然,我可以使用
MethodInfo.MakeGenericMethod(myType)
然后使用
method.Invoke
来调用接收到的方法。但正如我在前面提到的文章中所读到的,对构造函数调用
Invoke
需要花费很多时间,所以我想知道这是否也适用于常用方法

因此,寻找一种快速的方法来构造一个类型的实例,而不是寻找接收该类型的最佳解决方案,这将是相当矛盾的。那么有没有类似的方法(可能也使用表达式树)

一些用于编辑的代码:

public delegate T ObjectActivator<T>(params object[] args);

public class Test 
{

    public object create(Type t) 
    {
        // get the default-constructor
        ConstructorInfo ctor = t.GetConstructors().First();
        // pass the type to the generic method
        MethodInfo method = typeof(GenericTypeFactory).GetMethod("GetActivator").MakeGenericMethod(t);
        Func<ConstructorInfo, Delegate> getActivator = // howto point to the GetActivator-method by using the generic methodInfo from above         
    }
}

class GenericTypeFactory {
    public static ObjectActivator<T> GetActivator<T>(ConstructorInfo ctor) { /* ... */ }
}
public委托T ObjectActivator(params object[]args);
公开课考试
{
公共对象创建(类型t)
{
//获取默认构造函数
ConstructorInfo-ctor=t.GetConstructors().First();
//将类型传递给泛型方法
MethodInfo method=typeof(GenericTypeFactory).GetMethod(“GetActivator”).MakeGenericMethod(t);
Func getActivator=//如何使用上面的泛型methodInfo指向getActivator方法
}
}
类GenericTypeFactory{
公共静态ObjectActivator GetActivator(ConstructorInfo-ctor){/*…*/}
}

将字典从
类型
保存到生成的
操作
,该操作可以快速调用您的方法。然后,调用开销是字典查找,这比基于反射的调用要少得多。

是的,您可以对方法/属性调用执行相同的操作-缓存、编译表达式,如果真的很冒险,还可以手动执行
Reflection.Emit
。使用DLR调用通用方法。在构造对象后,将其存储为类型<代码>动态< /代码>,并将其传递给泛型方法。边注:考虑在标题中用“已知运行时”替换“动态”,以避免混淆<代码>动态< /代码>(如果确实如此)。你能给出一个符合事实的例子吗?并描述您的实际用例?直到运行时才知道类型是泛型的全部要点。很难猜测你为什么故意让它慢下来,这与使用泛型相反。问题更多的是如何建立这本词典(特别是其中的动作/函数)。@himbrombee有什么具体问题吗?应在SO或其他地方多次记录。创建对应于
(object obj)=>GenericMethod((ConcreteType)obj)
的表达式树。用C#编写此代码,并使用反编译器查看这样的树的外观。