【问题标题】:How to initialize a dynamic class that has a constructor如何初始化具有构造函数的动态类
【发布时间】:2019-04-24 11:26:21
【问题描述】:

我有以下课程:

public class CustomItem
{
    //....
}

并且有多个类在其构造方法中接受CustomClass。例如:

public class FirstClass
{
   public FirstClass(CustomItem customItem) { }
}

我正在尝试创建一个接受动态类并对其进行初始化的通用方法。像这样的:

public List<T> MyTestMethod<T>(CustomItem myCustomItem) where T : class, new()
{
   List<T> list = new List<T>();
   foreach(CustomItem myCustomItem in listOfCustomItems)
   {
      T instance = new T(myCustomItem);
      list.Add(T);
   }
   return list;
}

所以,它可以像这样使用:

List<FirstClass> List1 = MyTestMethod<FirstClass>(customItem);
List<SecondClass> List2 = MyTestMethod<SecondClass>(customItem);

MyTestMethod 中实例化T 的语法不正确。 我想做的事,可能吗?

【问题讨论】:

  • 为什么不允许传递Func&lt;CustomItem, T&gt; 来代替new 约束?这样,调用者可以随意创建实例。 (它也会使MyTestMethod 有效地过时,因为你可以只拥有一个.Select(...).ToList() 链。)
  • @JeroenMostert 你能帮我提供示例代码吗?
  • listOfCustomItems.Select(c =&gt; new FirstClass(c)).ToList()。你去吧,我刚刚完全废弃了MyTestMethod。但如果比这更复杂,MyTestMethod 可能是MyTestMethod&lt;T&gt;(Func&lt;CustomItem, T&gt; itemCreator) { ... foreach (var c in listOfCustomItems) { T t = itemCreator(c); ... } }。如果您坚持将其保留为构造函数,并且不想显式传递这些,则可以使用反射来做事,但这需要小心和注意优化。 (值得注意的是,Activator.CreateInstance 虽然很方便,但与直接调用相比非常慢。)

标签: c# .net reflection


【解决方案1】:

您可以尝试Activator 类来创建带参数的实例:

Activator.CreateInstance(typeof(T), args: myCustomItem);

在你的情况下:

public List<T> MyTestMethod<T>(CustomItem myCustomItem) where T : class
{
   List<T> list = new List<T>();
   foreach(CustomItem myCustomItem in listOfCustomItems)
   {
      T instance = (T)Activator.CreateInstance(typeof(T), args: myCustomItem);
      list.Add(instance);
   }
   return list;
}

【讨论】:

  • 注意:new() 约束不是必需的。
【解决方案2】:

你可以使用

T instance =  (T)Activator.CreateInstance(typeof(T), myCustomItem);

抱歉,10 秒前给出了正确答案:https://stackoverflow.com/a/55829165/5281555 :)

【讨论】:

    猜你喜欢
    • 2016-04-04
    • 1970-01-01
    • 2017-01-18
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    相关资源
    最近更新 更多