【问题标题】:Use variable of type Type as type使用类型类型的变量作为类型
【发布时间】:2014-04-27 16:43:48
【问题描述】:

假设我有这些课程

Animal
Cat : Animal
Dog : Animal

如果在某个方法中我有以下内容:

Type animalType = someClass.Animal.GetType();

如何将someClass.Animal 转换为animalType 中包含的任何类型?比如:

var animal = (animalType.Type)someClass.Animal;

【问题讨论】:

  • 你真正想做什么?应该没有必要这样做,因为无论如何您都无法使用它的方法/属性
  • 我一直在反复思考这个问题......我仍然认为这可能是一个有趣的练习。
  • 听起来你真的想要一个接口或者只是更强的继承

标签: c# casting type-conversion


【解决方案1】:

为此你需要一个通用方法:

public static class Converter
{
    public static T ConvertTo<T>(this object source) where T :class 
    {
        if (source is T)
        {
            return (T) source;
        }
        else
        {
            return null; // or throw exception
        }
    }
}

那么就可以使用Reflection来调用这个方法了:

class Animal { }
class Cat : Animal { }

class Dog : Animal
{
    public override string ToString()
    {
        return "I'm a dog!";
    }

     public bool IsDog { get { return true; } }
}

Animal a = new Dog();

var methodInfo = typeof (Converter)
                .GetMethod("ConvertTo", BindingFlags.Static | BindingFlags.Public);

var method = methodInfo.MakeGenericMethod(a.GetType());

var dog = method.Invoke(null, new object[] { a });

Console.WriteLine(dog.ToString());

在这种情况下,它会将I'm a dog 写入控制台。但由于Invoke 方法返回一个对象,您无法访问Dog 的方法或属性。为此,您可以使用动态 功能:

dynamic dog = method.Invoke(null, new object[] { a });

Console.WriteLine(dog.IsDog); // true

但是你失去了类型安全

因此,如果您不知道要在编译时转换的类型,则无法直接使用类型实例来执行此操作。

【讨论】:

  • dynamic 是我过去使用的......这正是我打开问题的原因,我在代码中找到了一个点,我知道那里的任何东西都有一个特定的属性,但是因为接口是通用的,我无法将对象转换为特定的通用类型。 +1 很好的解释:)
猜你喜欢
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 2023-04-10
  • 2016-06-10
  • 1970-01-01
相关资源
最近更新 更多