基于类型信息的动态投射

时间:2010-06-17 14:55:50

标签: c# casting

我想使用从一个数组到另一个数组的类型信息进行显式强制转换,这是通过继承关联的。我的问题是,在使用Type信息进行转换时,编译器会抛出错误,但我的要求是根据提供的Type信息动态转换。

请帮助

class Program
{
    static void Main(string[] args)
    {
        Parent[] objParent;
        Child[] objChild = new Child[] { new Child(), new Child() };
        Type TypParent = typeof(Parent);

        //Works when i mention the class name
        objParent = (Parent[])objChild;

        //Doesn't work if I mention Type info 
        objParent = (TypParent[])objChild;
    }
}

class Parent
{
}

class Child : Parent
{
}

1 个答案:

答案 0 :(得分:13)

动态投射的唯一方法是使用反射。当然,您无法将objChild投射到TypParent[] - 您正在尝试将Child数组投射到Type数组中。

您可以使用通过反射调用的.Cast<T>()方法来实现此目的:

 MethodInfo castMethod = this.GetType().GetMethod("Cast").MakeGenericMethod(typeParent);
 object castedObject = castMethod.Invoke(null, new object[] { objChild });

如果您需要一个非IEnumerable类型,请创建扩展/静态方法:

public static T Cast<T>(this object o)
{
    return (T)o;
}