Aar*_*ide 3 c# reflection templates
我想知道一个类型是否可以IQueryable.
var t = typeof(IQueryable<int>);
bool isQueryable = (t is IQueryable); // false
bool isAssignableFrom = t.IsAssignableFrom(typeof(IQueryable)); // false
bool nameStartsWithIQueryable = t.Name.StartsWith("IQueryable"); // true
Run Code Online (Sandbox Code Playgroud)
第三种方式 - 查看类型名称的开头 - 有效,但感觉就像一个黑客.
还有另一种方法来实现这一目标吗?
用途GetGenericTypeDefinition:
bool isQueryable = t.GetGenericTypeDefinition() == typeof(IQueryable<>);
Run Code Online (Sandbox Code Playgroud)
如果你需要处理更深的祖先(你在检查基类型的aganist),你可以编写一个辅助方法:
public static bool IsType(Type type, Type ancestor)
{
while (type != null)
{
if (type.IsGenericType)
type = type.GetGenericTypeDefinition();
if (type == ancestor)
return true;
type = type.BaseType;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
这样称呼它:
bool isQueryable = IsType(typeof(IQueryable<int>), typeof(IQueryable<>));
Run Code Online (Sandbox Code Playgroud)
(请注意,这对实现其他接口的基类型没有帮助,因为对此进行检查需要Type.GetInterfaces递归使用更多代码.)
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |