当然,以下不起作用。有没有可能的方法,这是非常相似的?
Type newObjectType = typeof(MyClass);
var newObject = givenObject as newObjectType;
答案 0 :(得分:9)
newObjectType
是Type
类的实例(包含有关类型的元数据),而不是类型本身。
这应该有效
var newObject = givenObject as MyClass;
OR
var newObject = (MyClass) givenObject;
转换为类型的实例确实没有意义,因为编译时必须知道变量类型应该是什么,而类型的实例是运行时概念。
var
可以工作的唯一方法是在编译时知道变量的类型。
Casting一般是编译时的概念,即你必须在编译时知道类型。
类型转换是一种运行时概念。
如果您需要使用类型的变量进行调用,并且在编译时不知道类型,则可以使用反射:使用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);