在下面的代码中,是否可以将 x 转换为您要传递的类型Activator.CreateInstance
提前不知道是什么?我尝试传入typeof...
但这行不通。
var testClasses = AppDomain.CurrentDomain.GetAssemblies()
.Single(a=>a.FullName.StartsWith("VerifyStuff")).GetTypes()
.Where(t=>t.UnderlyingSystemType.Name.StartsWith("VerifyXXX"));
var x = Activator.CreateInstance(testClasses.ElementAt(0));
Thanks!
你只需要投射它:
MyObject x = (MyObject) Activator.CreateInstance(testClasses.ElementAt(0));
当然,如果你有各种各样的类型,这会变得更加困难testClasses
。如果它们都派生自相同的基类或实现相同的接口,那么您可以转换为该基类或接口。
Edit:
是否可以将 x 转换为您传递给 Activator.CreateInstance 的类型而不提前知道它是什么?
只是为了更解释一点:x是您传递给的类型CreateInstance
,但它被转换为一个对象,因为 CreateInstance 不知道你可以向它抛出什么。您的问题发生在您创建具体实例之后 - 您无法将其传递给另一个(强类型)函数,因为您将其作为object
。有几种方法可以解决这个问题:
正如我上面提到的,让它们全部派生自相同的基类或接口,以便您可以将它们作为基类或接口类型传递
-
如果您有一个函数需要对这些具体实例执行操作,请创建一个通用函数来执行此操作:
public T MyFunc(T myConcreteInstance)
{
... do whatever it is i need to do...
}
-
这很丑陋,但可能很难避免......使用一个大的如果..否则如果在对它们进行操作之前确定它们的类型的语句(提示:避免使用上面的选项#1...):
Type t = myConcreteInstance.GetType();
if (t == typeof(someType1))
{
}
else if (t == typeof(someType2))
{
}
... etc ...
如果此时你正在想“为什么我不直接制作一个通用版本的 CreateInstance() 呢?”那么就不用麻烦了 - 已经有一个了,它仍然不能解决在传递事物之前将其强类型化的问题。引用MSDN:
一般来说,CreateInstance 在应用程序代码中没有用处,因为类型必须在编译时已知。如果类型在编译时已知,则可以使用正常的实例化语法(C# 中的 new 运算符、Visual Basic 中的 New、C++ 中的 gcnew)。
如果您要使用 CreateInstance,那是因为您提前不知道类型,因此您必须解决它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)