如何动态地将类型转换为泛型类型?

时间:2013-02-17 15:18:18

标签: c# generics

我有一些字符串,我想转换为不同的类型 - 通常是枚举。 持有这个类的类是泛型类型,所以即使我有类型保存我也找不到如何动态转换的方法

                if(type.IsEnum)
                     typedValue = Enum.Parse(type, value , true);
                }
                else
                {
                    typedValue = Convert.ChangeType(value,type);
                }

                foreach (Delegate method in pair.Value)
                {

                    method.DynamicInvoke(new[] { value, typedValue, time });
                }'

我需要将键入的值更改为不是类型save,而是根据类型将其更改为泛型类型

2 个答案:

答案 0 :(得分:0)

您不能这样做,因为只有在编译时才知道类型,才会使用泛型。在您的示例中,type变量表示运行时类型。

答案 1 :(得分:0)

您可以使用Type获取typeof通用参数。

public T Convert<T>(T value)
{
    Type type = typeof(T);
    if(type.IsEnum)
        return (T)Enum.Parse(type, value , true);
    } else {
        ...
    }
}

您也可以使用类的泛型参数来执行此操作。但无论如何,您需要在编译时知道类型。类型安全性基于编译器检查。如果您在编译时不知道类型,则需要返回objectdynamic,除非您有一个更具体的类型,所有相关类型都有共同点。


假设您能够创建一个完全动态返回正确类型的方法。

var converted = Convert(type, value);

// Are you allowed to do this?
converted = 2 * converted;

// or this?
converted = converted + " hello";

// or even this?
converted.SaveAs("C:\Data\Converted.txt");

由于调用者在编译时(甚至设计时)不知道类型,因此他无法以适当的方式使用此类型。这是一个逻辑限制,而不是语言的限制。即使使用动态语言或使用C-Sharp dynamic类型,您也需要了解您在设计时使用的类型。