当然,以下内容不起作用.有没有可能的方法,这是非常相似的?
Type newObjectType = typeof(MyClass);
var newObject = givenObject as newObjectType;
Run Code Online (Sandbox Code Playgroud)
Ali*_*tad 10
newObjectType是一个实例的的Type类(含有约类型的元数据)不是类型本身.
这应该工作
var newObject = givenObject as MyClass;
Run Code Online (Sandbox Code Playgroud)
要么
var newObject = (MyClass) givenObject;
Run Code Online (Sandbox Code Playgroud)
转换为类型的实例确实没有意义,因为编译时必须知道变量类型应该是什么,而类型的实例是运行时概念.
唯一var可行的方法是在编译时知道变量的类型.
转换通常是编译时的概念,即您必须在编译时知道类型.
类型转换是一种运行时概念.
如果需要使用类型的变量进行调用,并且在编译时不知道类型,则可以使用类型实例上的reflection:use Invoke方法MethodInfo.
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();
Run Code Online (Sandbox Code Playgroud)
您可以使用IsAssignableFrom检查类型是否存在
if(givenObject.GetType().IsAssignableFrom(newObjectType))
Run Code Online (Sandbox Code Playgroud)
但是你不能在这里使用var,因为在编译时不知道类型.
我最近遇到过这种情况,我需要像Tomislav的答案那样生成一些代码.不幸的是,在生成时间内,T型未知.但是,包含该类型实例的变量是已知的.一个解决方案肮脏的黑客/解决方法这个问题将是:
public void CastToMyType<T>(T hackToInferNeededType, object givenObject) where T : class
{
var newObject = givenObject as T;
}
Run Code Online (Sandbox Code Playgroud)
然后这可以调用CastToMyType(instanceOfNeededType, givenObject)并让编译器推断T.
小智 5
您可以使用Convert.ChangeType。根据msdn,它
返回指定类型的对象,其值等于指定对象。
你可以尝试下面的代码:
Type newObjectType = typeof(MyClass);
var newObject = Convert.ChangeType(givenObject, newObjectType);
Run Code Online (Sandbox Code Playgroud)