使用Type变量强制转换对象

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

Type newObjectType = typeof(MyClass); var newObject = givenObject as newObjectType; 

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

这应该工作

 var newObject = givenObject as MyClass; 

要么

 var newObject = (MyClass) givenObject; 

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

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


UPDATE

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

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


更新2

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

您可以使用IsAssignableFrom检查类型是否存在

 if(givenObject.GetType().IsAssignableFrom(newObjectType)) 

但是你不能在这里使用var,因为在编译时不知道类型。

我最近遇到过这种情况,我需要在Tomislav的答案中 生成一些代码。 不幸的是,在生成时间内,T型未知。 但是,包含该类型实例的变量是已知的。 针对该问题的解决方案脏黑客/解决方法将是:

 public void CastToMyType(T hackToInferNeededType, object givenObject) where T : class { var newObject = givenObject as T; } 

然后可以通过CastToMyType(instanceOfNeededType, givenObject)调用CastToMyType(instanceOfNeededType, givenObject) ,让编译器推断T.

也许你可以使用generics来解决这个问题。

 public void CastToMyType(object givenObject) where T : class { var newObject = givenObject as T; }