【发布时间】: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