繁体   English   中英

通用类型转换

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM