Nic*_*ick 7 c# inheritance .net-4.0
我试图返回实现下面的代码中定义的接口的类的对象类型.
linq语句只返回接口本身,因此控制台输出只是:
AssignableExperiment.IRule
为什么不返回具体类?
using System;
using System.Linq;
namespace AssignableExperiment
{
public interface IRule
{
void Validate(string s);
}
public class ConcreteRule : IRule
{
public void Validate(string s)
{
// some logic
}
}
class Program
{
static void Main(string[] args)
{
var ruleType = typeof(IRule);
var ruleTypes = from t in ruleType.Assembly.GetTypes()
where t.IsAssignableFrom(ruleType)
select t;
foreach (var type in ruleTypes)
{
Console.WriteLine(type);
}
Console.ReadLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)
nem*_*esv 10
你应该绕过IsAssignableFrom MSDN.因为IsAssignableFrom按照预期的方式工作:BaseType.IsAssignableFrom(DerviedType)返回true.
var ruleTypes = from t in ruleType.Assembly.GetTypes()
where ruleType.IsAssignableFrom(t)
select t;
Run Code Online (Sandbox Code Playgroud)
如果你不想回来IRule:
var ruleTypes = from t in ruleType.Assembly.GetTypes()
where ruleType.IsAssignableFrom(t) && t != ruleType
select t;
Run Code Online (Sandbox Code Playgroud)
我讨厌IsAssignableFrom,它是如此邪恶的写作.
我总是推广扩展:
public static bool IsTypeOf<T>(this Type type)
{
return typeof (T).IsAssignableFrom(type);
}
Run Code Online (Sandbox Code Playgroud)
使用它可以防止不正确的错误执行.
然后你可以写:
var ruleTypes = ruleType.Assembly.GetTypes().Where(t=> t.IsTypeOf<IRule>());
| 归档时间: |
|
| 查看次数: |
3039 次 |
| 最近记录: |