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