为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用反射动态创建通用C对象?

如何使用反射动态创建通用C对象?

慕侠2389804 2019-07-11 20:40:32
如何使用反射动态创建通用C对象?在C#中,我有以下对象:public class Item{ }public class Task<T>{ }public class TaskA<T> : Task<T>{ }public class TaskB<T> : Task<T>{ }我希望使用C#反射动态地创建TASCA或TaskB(Activator.CreateInstance)。但是,我不知道手之前的类型,所以我需要基于字符串(如“Nampace.askA”或“Nampacet.askAB”)动态创建TASKA。
查看完整描述

3 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

实际上,您将无法写出最后一行。

但是您可能不想创建对象,只是为了或为了创建它。您可能希望对新创建的实例调用一些方法。

然后,您将需要类似于接口的内容:

public interface ITask {
    void Process(object o);}public class Task<T> : ITask{ 
   void ITask.Process(object o) 
   {
      if(o is T) // Just to be sure, and maybe throw an exception
        Process(o as T);
   }

   public void Process(T o) { }}

并以:

Type d1 = Type.GetType("TaskA"); //or "TaskB"Type[] typeArgs = { typeof(Item) };
Type makeme = d1.MakeGenericType(typeArgs);ITask task = Activator.CreateInstance(makeme) as ITask;
// This can be Item, or any type derived from Itemtask.Process(new Item());

在任何情况下,你都不会被静态地投到你事先不知道的类型中(在这个例子中是“makame”)。ITASK允许你进入你的目标类型。

如果这不是你想要的,你可能需要在你想要达到的目标上更具体一点。


查看完整回答
反对 回复 2019-07-11
?
aluckdog

TA贡献1847条经验 获得超7个赞

请确保您这样做是有充分理由的,下面这样的简单函数将允许静态类型,并允许IDE执行诸如“查找引用”和“重构->重命名”之类的操作。

public Task <T> factory (String name){
  Task <T> result;

  if (name.CompareTo ("A") == 0)
  {
    result = new TaskA ();
  }
  else if (name.CompareTo ("B") == 0)
  {
    result = new TaskB ();
  }

  return result;}


查看完整回答
反对 回复 2019-07-11
  • 3 回答
  • 0 关注
  • 521 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信