编辑:更改了Activator
,仍然不起作用。
所以我对 C# 非常(非常)陌生,我很确定这是一个骗局,但我已经浏览了前面的问题,但我仍然无法弄清楚所有要点。
我试图通过用通用列表上的映射替换一些重复的代码来减少代码味道。具体来说,我的代码看起来像
var fooNode = node as IFoo;
var barNode = node as IBar;
var bazNode = node as IBaz;
...
if(fooNode != null)
return new FooThing();
if(barNode != null)
return new BarThing();
if(bazNode != null)
return new BazThing();
...
我想概括它。
这是我的尝试:
var types = new Dictionary<Type, Type>
{
{typeof(IFoo), typeof(FooThing)},
{typeof(IBar), typeof(BarThing)},
...
}
foreach(var entry in types)
{
var castNode = node as entry.Key;
return Activator.CreateInstance(entry.Value);
}
当然,它不起作用:找不到类型或命名空间名称“entry”(是否缺少 using 指令或程序集引用?)
。你能帮我吗?这种事情在 C# 中可能实现吗?
最佳答案
这个怎么样?
foreach(var entry in types)
{
if (node != null && entry.Key.IsAssignableFrom(node.GetType()))
{
return Activator.CreateInstance(entry.Value);
}
}
问题在于您将泛型类型参数与运行时类型混淆,特别是 Type
类。
如果您知道编译时的类型是什么,那么您可以使用泛型 Activator.CreateInstance<T>()
方法来创建底层对象的实例 - 您可以使用类型参数之类的东西,这样这行代码就不需要知道类型是什么,例如:
T CreateObject<T>()
{
return Activator.CreateInstance<T>();
}
然而这只是推卸责任。为了调用此方法,类型参数的值 T
必须在某处提供 - 无论哪种方式,编译器都必须能够解析 T
类型(而不是变量或方法)。
相反,Type
类在运行时对类型信息进行编码,例如其名称或声明类型的程序集。Activator.CreateInstance
还带有一个重载,允许您提供 Type
的实例:
object CreateObject(Type type)
{
return Activator.CreateInstance(type);
}
在您的情况下,您似乎不知道编译时的类型是什么,因此您将主要使用 Type
类 - 您可以使用 typeof(MyClass)
获取相应Type
的实例对于运行时已知的类,并且 myObject.GetType()
在运行时获取对象的类型信息。
关于c# - 动态类型传递和实例化——如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6664947/