如果我有类型和对象,例如:
- Type someType (coming from somewhere, could be any class eg. MyClass.GetType())
- Object someObject (eg. List<MyClass>())
并希望将对象强制转换回List<MyClass>
。我该怎么办?
答案 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; ...