4

我正在使用此扩展方法来转换项目中的对象。但它无法转换GUID,因为它没有实现IConvertible接口,但对于转换我总是必须使用new Guid(fooobject),但我希望我可以使用这种方法将对象转换为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;
        }
    }
4

1 回答 1

2

因为您有要转换为的类型实现IConvertible接口的约束(而Guid结构没有),所以您别无选择创建重载,如下所示:

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

当您通过 a时,由于C# 规范的第 7.4.2 节(强调我的)Guid,它将解决:

一旦确定了候选函数成员和参数列表,最佳函数成员的选择在所有情况下都是相同的:

  • 给定一组适用的候选函数成员,找到该集合中的最佳函数成员。

鉴于这Guid是比类型参数更具体的匹配T,您的第二个方法将被调用。

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

于 2012-08-07T20:40:38.533 回答