通用类型转换

时间:2011-01-13 15:37:54

标签: c# generics casting

如果我有类型和对象,例如:

 - Type someType (coming from somewhere, could be any class eg. MyClass.GetType())
 - Object someObject (eg. List<MyClass>())

并希望将对象强制转换回List<MyClass>。我该怎么办?

5 个答案:

答案 0 :(得分:1)

你不能这样做。泛型可确保编译时的安全性。您不能拥有编译时安全性,因为您只在运行时知道实际类型。

答案 1 :(得分:0)

您有一个运行时类型,并且您希望执行编译时转换。这是不可能的。目前还不清楚为什么你想要首先这样做。如果您对需要reflection的案例感兴趣,也许您应该进一步调查该主题。

答案 2 :(得分:0)

当您仅在运行时收到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"});
}

答案 3 :(得分:0)

强制转换意味着明确指定要转换为的类型。由于你不知道你的类型是什么,你不能投入它。

这并不意味着您无法访问该列表。如果你知道你拥有的对象是某个东西的列表,你可以将它转换为非通用的IList接口,它提供了你需要的大多数方法和属性:

object obj = GetMyList();
IList list = (IList)obj;
object fifthItem = list[4];
list.RemoveAt(list.Count - 1);

如果你描述的是你试图解决的问题而不是你想要解决的问题,那么可能会发布更合适的解决方案。

答案 4 :(得分:0)

如果你试图在编译时强制转换运行时类型,那就不可能像我之前所说的那样 但是,你可以作弊(但不要过度使用这种技术,它会导致黑暗的道路......)

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转换为IList <IFoo&gt;并获得List <Foo的所有好处&gt; ...