2017-08-31 20 views
1

我想了解反射机制。 我想比较一个对象的属性与给定的值。 现在,我希望能够知道(当然在运行时)两个对象是否可比较,而不是执行比较并捕获异常。c#在运行时检查两个对象是否具有可比性

喜欢的东西:

public bool IsComparableWithProperty(string propertyName, object value) 
{ 
    return typeof(MyType).GetProperty(propertyName).PropertyType is IComparable<value.GetType()>   
} 

当然,我知道这是不是有效,仿制药必须在编译时是已知的。 我想知道这种行为是否可以在C#中实现。

感谢

回答

3

您可以使用MakeGenericType与值运行时类型实例化通用的接口定义和使用IsAssignableFrom检查兼容性。

public bool IsComparableWithProperty(string propertyName, object value) 
{ 
    return typeof(IComparable<>).MakeGenericType(value.GetType()).IsAssignableFrom(typeof(MyType).GetProperty(propertyName).PropertyType); 
} 
+0

如果我反其道而行,可能会得到不同的结果吗? 这可能是假的吗? (IComparable <>)。MakeGenericType(o1.GetType())。IsAssignableFrom(o2.GetType())== typeof(IComparable <>)。MakeGenericType(o2.GetType())。IsAssignableFrom(o1.GetType() ))' – AFusco

+0

我不确定比较有多大意义..你正在比较'T2 is ICoamparable 'to'T1 is IComparable '... –

+0

对于方法中返回true的表达式,属性类型会有ti是实施'IComparable '的东西 –

相关问题