C# 通用型铸造

C# 通用型铸造,c#,generics,casting,C#,Generics,Casting,如果我有一个类型和一个对象,例如: - Type someType (coming from somewhere, could be any class eg. MyClass.GetType()) - Object someObject (eg. List<MyClass>()) -键入someType(来自某处,可以是任何类,例如MyClass.GetType()) -对象someObject(例如List()) 并希望将对象投射回列表。我该怎么做 你不能这么做。泛型确保

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

 - Type someType (coming from somewhere, could be any class eg. MyClass.GetType())
 - Object someObject (eg. List<MyClass>())
-键入someType(来自某处,可以是任何类,例如MyClass.GetType())
-对象someObject(例如List())

并希望将对象投射回
列表
。我该怎么做

你不能这么做。泛型确保编译时安全。您不能具有编译时安全性,因为您仅在运行时知道实际类型。

您具有运行时类型,并且希望执行编译时强制转换。这是不可能的。我们也不清楚你为什么要这么做。如果您对需要的情况感兴趣,也许您应该进一步研究该主题。

如果您仅在运行时收到类型信息,则无法在编译时键入变量

这与泛型不同,因为在泛型中,您可以在编译时获得类型信息:

void MyFunc<T>(T thing)
{
  // T is passed in at compile time
}

强制转换意味着显式指定要转换为的类型。既然你不知道自己是什么类型的人,你就不能投靠它

这并不意味着你不能访问列表。如果您知道您拥有的对象是某个对象的列表,则可以将其强制转换到非通用的
IList
界面,该界面提供了您所需的大多数方法和属性:

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

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

如果您试图在编译时强制转换运行时类型,这是不可能的,正如梅在我之前所说。
然而,你可以欺骗一点(但不要过度使用这种技巧,它会导致一条黑暗的道路……)

public void DoSomething(列表对象),其中T:。。。。
{
//你想在这里干什么就干什么
}
public void CallIt(类型t,对象o)//o是列表
{
this.GetType().GetMethod(“DoSomething”).MakeGenericMethod(t).Invoke(o);
}

然而,我看不出这有什么真正的好处,因为如果您不编写任何类型约束,那么使用泛型而不是对象和IList接口,您将一无所获,如果您在那里编写任何基类或接口,您可以将您的对象强制转换为它。(例如,如果您知道T实现了IFoo,您可以将o转换为IList
,并从List
中获益……

您的问题没有意义。请给出一个您试图实现的示例。
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);
}