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

如何使用反射动态创建通用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。


慕侠2389804
浏览 525回答 3
3回答

慕容708150

实际上,您将无法写出最后一行。但是您可能不想创建对象,只是为了或为了创建它。您可能希望对新创建的实例调用一些方法。然后,您将需要类似于接口的内容:public&nbsp;interface&nbsp;ITask&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;Process(object&nbsp;o);}public&nbsp;class&nbsp;Task<T>&nbsp;:&nbsp;ITask{&nbsp; &nbsp;&nbsp;&nbsp;void&nbsp;ITask.Process(object&nbsp;o)&nbsp; &nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(o&nbsp;is&nbsp;T)&nbsp;//&nbsp;Just&nbsp;to&nbsp;be&nbsp;sure,&nbsp;and&nbsp;maybe&nbsp;throw&nbsp;an&nbsp;exception &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Process(o&nbsp;as&nbsp;T); &nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;Process(T&nbsp;o)&nbsp;{&nbsp;}}并以:Type&nbsp;d1&nbsp;=&nbsp;Type.GetType("TaskA");&nbsp;//or&nbsp;"TaskB"Type[]&nbsp;typeArgs&nbsp;=&nbsp;{&nbsp;typeof(Item)&nbsp;}; Type&nbsp;makeme&nbsp;=&nbsp;d1.MakeGenericType(typeArgs);ITask&nbsp;task&nbsp;=&nbsp;Activator.CreateInstance(makeme)&nbsp;as&nbsp;ITask; //&nbsp;This&nbsp;can&nbsp;be&nbsp;Item,&nbsp;or&nbsp;any&nbsp;type&nbsp;derived&nbsp;from&nbsp;Itemtask.Process(new&nbsp;Item());在任何情况下,你都不会被静态地投到你事先不知道的类型中(在这个例子中是“makame”)。ITASK允许你进入你的目标类型。如果这不是你想要的,你可能需要在你想要达到的目标上更具体一点。

aluckdog

请确保您这样做是有充分理由的,下面这样的简单函数将允许静态类型,并允许IDE执行诸如“查找引用”和“重构->重命名”之类的操作。public&nbsp;Task&nbsp;<T>&nbsp;factory&nbsp;(String&nbsp;name){ &nbsp;&nbsp;Task&nbsp;<T>&nbsp;result; &nbsp;&nbsp;if&nbsp;(name.CompareTo&nbsp;("A")&nbsp;==&nbsp;0) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;new&nbsp;TaskA&nbsp;(); &nbsp;&nbsp;} &nbsp;&nbsp;else&nbsp;if&nbsp;(name.CompareTo&nbsp;("B")&nbsp;==&nbsp;0) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;new&nbsp;TaskB&nbsp;(); &nbsp;&nbsp;} &nbsp;&nbsp;return&nbsp;result;}
打开App,查看更多内容
随时随地看视频慕课网APP