[英]cast object with a Type variable
当然,以下不起作用。 有没有可能的方法,这非常相似?
Type newObjectType = typeof(MyClass);
var newObject = givenObject as newObjectType;
newObjectType
是Type
类的实例(包含有关类型的元数据)而不是类型本身。
这应该工作
var newObject = givenObject as MyClass;
要么
var newObject = (MyClass) givenObject;
强制转换为类型的实例确实没有意义,因为编译时必须知道变量类型应该是什么,而类型的实例是运行时概念。
var
可以工作的唯一方法是变量的类型在编译时是已知的。
强制转换通常是一个编译时概念,即您必须在编译时知道类型。
类型转换是一个运行时概念。
如果需要使用该类型的变量进行调用,并且在编译时不知道该类型,则可以使用反射:在类型实例上使用MethodInfo
Invoke
方法。
object myString = "Ali";
Type type = myString.GetType();
MethodInfo methodInfo = type.GetMethods().Where(m=>m.Name == "ToUpper").First();
object invoked = methodInfo.Invoke(myString, null);
Console.WriteLine(invoked);
Console.ReadLine();
我最近遇到了这样的情况,我需要像Tomislav's answer那样生成一些代码。 不幸的是,在世代时期,T 型是未知的。 但是,包含该类型实例的变量是已知的。 该问题的
解决方案
脏黑客/解决方法是:
public void CastToMyType<T>(T hackToInferNeededType, object givenObject) where T : class
{
var newObject = givenObject as T;
}
然后可以通过CastToMyType(instanceOfNeededType, givenObject)
调用CastToMyType(instanceOfNeededType, givenObject)
并让编译器推断 T。
您可以使用 IsAssignableFrom 检查该类型是否存在
if(givenObject.GetType().IsAssignableFrom(newObjectType))
但是你不能在这里使用 var 因为类型在编译时是未知的。
您可以使用 Convert.ChangeType。 根据msdn ,它
返回一个指定类型的对象,其值等同于指定的对象。
你可以试试下面的代码:
Type newObjectType = typeof(MyClass);
var newObject = Convert.ChangeType(givenObject, newObjectType);
也许你可以使用泛型来解决这个问题。
public void CastToMyType<T>(object givenObject) where T : class
{
var newObject = givenObject as T;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.