2013-02-17 60 views
-2

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

   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 }); 
       }' 

一种方法,我需要改变输入的值是不是类型的保存但作为一种通用类型根据类型

+0

你举个例子吗?因为正如问题所在,要弄清楚你想要什么是非常困难的 – 2013-02-17 15:28:30

回答

0

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

0

您可以通过typeof获得泛型参数的Type

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类型,您也需要了解您在设计时使用的类型。