Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.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_Dynamic - Fatal编程技术网

C# 动态方法创建

C# 动态方法创建,c#,reflection,dynamic,C#,Reflection,Dynamic,所以,我整个上午都在努力研究这个问题,但运气不好。我试图找到一种动态创建方法/委托/lambda的方法,该方法返回从某个基类继承的某个类(直到运行时才知道)的新实例 我可以保证以下关于未知/动态类的信息 它将始终从一个已知类(行)继承 它将至少有2个构造函数(一个接受long,一个接受IDataRecord) 我计划做以下工作: 查找具有特定属性的所有类 创建委托/方法/lambda/创建类的新实例的任何对象 在结构/类中存储委托/任何内容以及某些属性 将结构插入哈希表 需要时,从哈希表中提取信

所以,我整个上午都在努力研究这个问题,但运气不好。我试图找到一种动态创建方法/委托/lambda的方法,该方法返回从某个基类继承的某个类(直到运行时才知道)的新实例

我可以保证以下关于未知/动态类的信息

  • 它将始终从一个已知类(行)继承
  • 它将至少有2个构造函数(一个接受long,一个接受IDataRecord)
  • 我计划做以下工作:

  • 查找具有特定属性的所有类
  • 创建委托/方法/lambda/创建类的新实例的任何对象
  • 在结构/类中存储委托/任何内容以及某些属性
  • 将结构插入哈希表
  • 需要时,从哈希表中提取信息,调用委托/任何东西来获取类的新实例,并将其返回/添加到列表中/等等
  • 我只需要上面第2条的帮助!!!我不知道从哪里开始。我真的只需要一些参考资料,让我开始,或一些关键字扔到谷歌

    这是为我们这里的办公室设计的一个紧凑/易于使用的ORM。我明白上面所说的并不简单,但一旦工作起来,应该会使维护代码变得非常简单


    如果您需要更多信息,请告诉我!先谢谢你!:)

    那么
    Activator.CreateInstance

    样本:

    string typeName = ...;
    Activator.CreateInstance(Type.GetType(typeName), params);
    

    您可以使用LINQ表达式在运行时构造lambda
    (长p)=>新的XXX(p)作为行

    Type type = // ...
    ConstructorInfo ctor = type.GetConstructor(new Type[] { typeof(long) });
    
    var p = Expression.Parameter(typeof(long), "p");
    var expr = Expression.Lambda<Func<long, Row>>(
                   Expression.TypeAs(
                       Expression.New(ctor, p),
                       typeof(Row)),
                   p);
    
    Func<long, Row> rowCreator = expr.Compile();
    
    Row row = rowCreator(10);
    
    Type=/。。。
    ConstructorInfo-ctor=type.GetConstructor(新类型[]{typeof(long)});
    var p=表达式参数(typeof(long),“p”);
    var expr=Expression.Lambda(
    表达式.TypeAs(
    新表达式(ctor,p),
    类型(行)),
    p) );
    Func rowCreator=expr.Compile();
    行=行创建者(10);
    
    我相信CreateInstance有一个重载,可以让您指定构造函数参数。这将是你的最佳选择。这将很好,除非他必须每秒执行数千次,在这种情况下,编译委托会更好。我正在寻找编译委托:-\n这将在网站上运行,如果可能的话,我希望在加载时发生一次反射导致的性能下降。值得注意的是,对于紧凑型框架,您不能使用这种方法。然后你需要深入思考,做同样的事情。。至少用params调用一个ctor。从未真正看到表达式的良好用途,但你让我大开眼界:)我喜欢这个样式,但它是否编译为真正的IL,性能是否与new long()一样好@Andrey:
    expr.Compile()
    将表达式编译为实际IL。性能与lambda表达式在编译时编译时的性能相同,因此它可以得到:-),尽管type.GetConstructor不应该被多次调用,否则它将破坏性能。@Andrey:expr.compile()返回的编译后的lambda可以缓存并在以后多次重用。无需多次构造表达式。