2012-08-06 29 views
4

我使用此扩展方法来转换项目中的对象。但它无法转换为GUID,因为它没有实现IConvertible接口,但对于转换,我总是不得不使用new Guid(fooobject),但我希望我可以使用此方法将对象转换为GUID。任何想法如何使我们能够灵活使用GUID也。扩展方法:如何使它与GUID一起工作

扩展方法是

public static T ToType<T>(this object val, T alt) where T : struct, IConvertible 
    { 
     try 
     { 
      return (T)Convert.ChangeType(val, typeof(T)); 
     } 
     catch 
     { 
      return alt; 
     } 
    } 
+0

虽然GUID确实有[自己的TypeConverter](http://msdn.microsoft.com/en-us/library/system.componentmodel.guidconverter),您可以随时进行特殊情况检查'typeof(T)''。 ASPX)。您可能需要将'val'转换为'string'。否则,请参阅页面上的示例。 – 2012-08-06 07:03:13

+0

是'TypeConverter'不存在GUID,因为它是我猜的值类型。我们需要明确地取消装箱,将其转换为GUID。这就是为什么我想要使用扩展方法做到这一点... – 2012-08-06 07:06:34

+0

我很确定它仍然会工作..如果'val'是*不* GUID值,那么你需要转换它。如果它是一个GUID,你可以用'typeof(T)'检查来判断,并直接进行转换。 – 2012-08-06 07:07:49

回答

2

因为你有该类型要转换为实现IConvertible interface(而Guid structure)不,你没有选择创建一个过载,这样的约束:

public static Guid ToType(this object val, Guid alt) 
{ 
    try 
    { 
     // Convert here. 
    } 
    catch 
    { 
     return alt; 
    } 
} 

当你传递一个Guid,这将解决因section 7.4.2 of the C# specification(重点煤矿):

一旦候选函数成员和参数列表已经 确定,最好的函数成员的选择在 情况都一样:

  • 给定了适用的候选函数成员的,最好的该组中的函数成员位于。

鉴于Guid比类型参数T更具体的比赛,你的第二个方法将被调用。

注意,如果你删除IConvertible接口约束,你可以在一个单一的方法处理这个问题,但你必须要能够有逻辑来处理传递了T(一TypeConverter实例任何结构将在这里很方便)。

相关问题