繁体   English   中英

使用类型变量强制转换对象

[英]cast object with a Type variable

当然,以下不起作用。 有没有可能的方法,这非常相似?

Type newObjectType = typeof(MyClass);

var newObject = givenObject as newObjectType;

newObjectTypeType类的实例(包含有关类型的元数据)而不是类型本身。

这应该工作

var newObject = givenObject as MyClass;

要么

var newObject = (MyClass) givenObject;

强制转换为类型的实例确实没有意义,因为编译时必须知道变量类型应该是什么,而类型的实例是运行时概念。

var可以工作的唯一方法是变量的类型在编译时是已知的。


更新

强制转换通常是一个编译时概念,即您必须在编译时知道类型。

类型转换是一个运行时概念。


更新 2

如果需要使用该类型的变量进行调用,并且在编译时不知道该类型,则可以使用反射:在类型实例上使用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.

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