使用Type变量强制转换对象

Mic*_*ing 15 c# types

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

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可行的方法是在编译时知道变量的类型.


UPDATE

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

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


更新2

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

  • 我认为OP需要在运行时进行某种动态转换. (11认同)
  • 此答案需要编辑或删除。展示如何调用 MethodInfo.Invoke 仍然没有回答这个问题。 (2认同)

Stu*_*tLC 5

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

if(givenObject.GetType().IsAssignableFrom(newObjectType))
Run Code Online (Sandbox Code Playgroud)

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


Sil*_*las 5

我最近遇到过这种情况,我需要像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)

  • 除了“newObjectType”必须实现“IConvertible”接口。否则,它会抛出“System.InvalidCastException”。 (3认同)
  • 由于这返回对象,因此它将无法用作某些方法的输入......这使我们回到如何动态转换的问题。 (3认同)