2015-11-05 36 views
1

我有两个不相关的类:一个不是从另一个派生的。 这些类没有实现IConvertible。这就是为什么This answer不起作用。如何确定一个对象是否可以转换为不同类型,不带IConvertible

幸运的是,有一个从一个类到另一个类的隐式类运算符。

示例:考虑 - System.Data.Entity.DbSet - System.Data.Entity.DbSet。

隐式类型转换操作符:

public static implicit operator DbSet (DbSet<TEntity> entry) 

以下工作:

DbSet<MyClass> x = new DbSet<MyClass>(); 
DbSet y = (DbSet) x;   // ok, x properly cast to y 

下不起作用:

object x = new DbSet<MyClass>(); 
object y1 = x as DbSet;  // y1 is null, because not derived from DbSet 
object y2 = (DbSet) x;  // throws InvalidCastException 

所以是可以检查一个对象是否可以投掷到另一个对象而不抛出异常?

回答

0

你应该能够搜索使用反射转换方法:

object set = new DbSet<MyClass>(); 
var conv = set.GetType().GetMethod("op_Implicit", BindingFlags.Static | BindingFlags.Public, null, new[] { set.GetType() }, null); 
if (conv != null && conv.ReturnType == typeof(DbSet)) 
{ 
    var rawSet = (DbSet)conv.Invoke(null, new object[] { set }); 
} 
+0

这工作。我不知道隐式和显式运算符有预定义的名称。我现在要做的就是创建扩展函数object.TryCast。谢谢李! –

0

李加瓦答案。我通过创建扩展方法来测试它,只要对象具有隐式或显式的操作符到所请求的类型,就可以将任何对象转换为任何类型。

public static class ObjectExtensionTryCast 
{ 
    public static bool TryCast<T>(this object o, out T castedValue) 
    { 
     MethodInfo castMethod = new string[] { "op_Implicit", "op_Explicit" } 
      .Select(methodName => o.GetType() 
       .GetMethod(methodName, BindingFlags.Static | BindingFlags.Public, null, new[] { o.GetType() }, null)) 
      .Where(method => method.ReturnType == typeof(T)) 
      .FirstOrDefault(); 
     bool canCast = castMethod != null; 
     castedValue = canCast ? 
      (T)castMethod.Invoke(null, new object[] { o }) : 
      default(T); 
     return canCast; 
    } 
} 

用法:

object o = GetMyObject(); 
int i; 
System.Drawing.Point p; 
DBSet dbSet; 

bool intCasted = o.TryParse(out i); 
bool pointCasted = o.TryParse(out p); 
bool dbSetCasted = o.TryParse(out dbSet); 
相关问题