我使用这个扩展方法来转换项目中的对象。但它无法转换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;
}
}
因为您有一个约束,即您要转换为的类型实现IConvertible
接口(而Guid
结构没有),所以您没有选择创建重载,如下所示:
public static Guid ToType(this object val, Guid alt)
{
try
{
// Convert here.
}
catch
{
return alt;
}
}
当您通过Guid
时,由于C#规范的第7.4.2节(强调矿),它将被解析:
一旦候选函数成员和参数列表已识别,最佳功能成员的选择与所有情况:
- 给定一组适用的候选函数成员,即可定位该集合中的最佳函数成员
假设Guid
是比类型参数T
更具体的匹配,则将调用第二个方法。
注意,如果您删除了IConvertible
接口约束,您可以在一个方法中处理它,但您必须能够有逻辑来处理为T
传递的任何结构(TypeConverter
实例在这里很方便)。