使用Type变量强制转换对象

时间:2012-01-25 15:38:25

标签: c# types

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

Type newObjectType = typeof(MyClass);

var newObject = givenObject as newObjectType;

5 个答案:

答案 0 :(得分:9)

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

这应该有效

var newObject = givenObject as MyClass;

OR

var newObject = (MyClass) givenObject;

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

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


更新

Casting一般是编译时的概念,即你必须在编译时知道类型。

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


更新2

如果您需要使用类型的变量进行调用,并且在编译时不知道类型,则可以使用反射:使用Invoke MethodInfo方法1}}在类型实例上。

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();

答案 1 :(得分:5)

您可以使用IsAssignableFrom

检查类型是否存在
if(givenObject.GetType().IsAssignableFrom(newObjectType))

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

答案 2 :(得分:5)

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

    columns.Bound(p => p.EndDate).Title("End Date").ClientTemplate("#=EndDate.toString({0:h:mm:ss tt})#").Width(100);

然后这可以由public void CastToMyType<T>(T hackToInferNeededType, object givenObject) where T : class { var newObject = givenObject as T; } 调用,让编译器推断出T。

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

您可以使用Convert.ChangeType。根据{{​​3}},它

  

返回指定类型的对象,该对象的值等于a   指定的对象。

您可以尝试以下代码:

Type newObjectType = typeof(MyClass);

var newObject = Convert.ChangeType(givenObject, newObjectType);
相关问题