在实体框架中,我有一个主类,其中包含2个子类的ICollection定义。
public partial class Class1{
public virtual ICollection<Class2> Class2 {get;set;}
public virtual ICollection<Class3> Class3 {get;set;}
}
public partial class Class2 : ITotal {
public double Total {get;}
}
public partial class Class3 {
}
Class2实现了ITotal接口...... Class3没有。
总共Class1有大约30个ICollections实例,其中基础对象实现ITotal接口。它还有10多个ICollections没有实现接口。
在Class1中,我需要能够动态获取其基类型实现ITotal接口的所有ICollections。然后我将添加“总计”字段以获得总计。我需要它是动态的原因是因为我将向class1添加更多的ICollections,我不想/需要记住去多个地方以使总数准确。
下面是我到目前为止的一个示例...这段代码给了我所有的ICollection类,但现在我被卡住了。理想情况下,我可以在最后一次选择之后添加另一个where子句,但我愿意完全废弃它。
var value1 = t.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)
.Where(x => x.CanWrite && x.GetGetMethod().IsVirtual)
.Select(x => x.GetValue(this, null))
.Where(x => x != null)
.Where(x => x.GetType().GetInterfaces().Any(y => y.IsGenericType && y.GetGenericTypeDefinition() == typeof(ICollection<>)))
.Select(x=> ((IEnumerable)x))
.ToList()
;
有什么想法吗?
答案 0 :(得分:0)
像这样:
var c = new Class1();
//. . .
var q = from p in typeof(Class1).GetProperties()
where p.PropertyType.IsConstructedGenericType
&& p.PropertyType.GetGenericTypeDefinition().Equals(typeof(ICollection<>))
&& typeof(ITotal).IsAssignableFrom(p.PropertyType.GetGenericArguments()[0])
select p;
var ITotalCollections = q.ToList();
var q2 = from p in ITotalCollections
from i in (IEnumerable<ITotal>)p.GetValue(c)
select i.Total;
var total = q2.Sum();