【问题标题】:Extension method : how to make it work with GUID also扩展方法:如何使其也与 GUID 一起使用
【发布时间】:2012-08-03 03:30:51
【问题描述】:

我正在使用此扩展方法来转换项目中的对象。但它无法转换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;
        }
    }

【问题讨论】:

  • 您始终可以对 typeof(T) 进行特殊情况检查 .. 尽管 GUID 确实有 its own TypeConverter。您可能需要将val 转换为string。否则,请参阅页面上的示例。
  • 是的 TypeConverter 不存在 GUID,因为我猜它是值类型。我们需要始终明确地拆箱以将其转换为 GUID。这就是为什么我想使用扩展方法来做到这一点......
  • 我很确定它仍然可以工作。如果val 不是 GUID 值,那么您需要转换它。如果它是 GUID,您可以通过 typeof(T) 检查并直接进行转换。
  • @pst 不,先生,它不起作用并显示错误无法隐式转换错误...您可以通过一个简单的示例来尝试...
  • 哦,我明白了。问题是T 的约束与IConvertible 相比过于严格(它与in 方法中的内容无关)。您需要放松它们(并在方法内部进行检查)或创建重载。 (虽然我不确定是否可以基于泛型的类型细化来重载方法..)

标签: linq c#-4.0 extension-methods guid iconvertible


【解决方案1】:

因为您有要转换为的类型实现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 接口约束,您可以在单个方法中处理此问题,但您必须能够有逻辑来处理传递给的 any 结构TTypeConverter 实例在这里会很方便)。

【讨论】:

    猜你喜欢
    • 2017-05-11
    • 2014-02-05
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    相关资源
    最近更新 更多