我有一些字符串,我想转换为不同的类型 - 通常是枚举。 持有这个类的类是泛型类型,所以即使我有类型保存我也找不到如何动态转换的方法
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,而是根据类型将其更改为泛型类型
答案 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 {
...
}
}
您也可以使用类的泛型参数来执行此操作。但无论如何,您需要在编译时知道类型。类型安全性基于编译器检查。如果您在编译时不知道类型,则需要返回object
或dynamic
,除非您有一个更具体的类型,所有相关类型都有共同点。
假设您能够创建一个完全动态返回正确类型的方法。
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
类型,您也需要了解您在设计时使用的类型。