[英]Generic type casting
如果我有一个类型和一个对象,例如:
- Type someType (coming from somewhere, could be any class eg. MyClass.GetType())
- Object someObject (eg. List<MyClass>())
并想将该对象投射回List<MyClass>
。 我应该怎么做?
你做不到 泛型确保编译时安全。 您不能具有编译时间安全性,因为您仅在运行时才知道实际类型。
您具有运行时类型,并且想要执行编译时强制转换。 这是不可能的。 还不清楚您为什么首先要这样做。 如果您对需要反思的案例感兴趣,也许您应该进一步调查该主题。
当您仅在运行时收到Type信息时,无法在编译时键入变量。
这与泛型不同,因为在泛型中您可以在编译时获取类型信息:
void MyFunc<T>(T thing)
{
// T is passed in at compile time
}
在您的情况下,您将在运行时获取类型。 因此,尽管您不能像通常那样将成员转换为类型,但您可以在实例上进行反思并调用其成员:
void MyFunc(object thing, Type type)
{
var res = t.GetMethod("Add").Invoke(a, new []{"someArg"});
}
强制转换意味着明确指定要转换为的类型。 由于您不知道您的类型是什么,因此无法强制转换为它。
这并不意味着您无法访问该列表。 如果您知道所拥有的对象是某物的列表,则可以将其IList
转换为非通用的IList
接口,该接口提供所需的大多数方法和属性:
object obj = GetMyList();
IList list = (IList)obj;
object fifthItem = list[4];
list.RemoveAt(list.Count - 1);
如果您描述的是您要解决的问题,而不是要解决的解决方案,那么可能会发布更多合适的解决方案。
如果您试图在编译时强制转换运行时类型,那就像我之前所说的那样是不可能的。
但是,您可以作弊一些(但不要过度使用此技术,它会导致黑暗的道路...)
public void DoSomething<T>(List<T> object) where T : ....
{
//do what you want here
}
public void CallIt(Type t, object o) //o is List<Foo>
{
this.GetType().GetMethod("DoSomething").MakeGenericMethod(t).Invoke(o);
}
但是,我没有看到任何真正的好处,就像您不编写任何类型约束一样,使用泛型而不是对象和IList接口也不会获得任何好处,并且如果您在其中编写任何基类或接口,则可以只转换反对。 (例如,如果您知道T实现了IFoo,则可以将o <IFoo
为IList <IFoo
>并获得List <Foo
>的所有好处。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.