【发布时间】:2014-07-08 11:53:10
【问题描述】:
这个问题是这个问题here 的延续。如果有人想知道我为什么需要做这样的事情,你可以在那个问题中找到理由。没关系,真的。
我需要这样的方法:
public virtual Expression<Func<T, object>> UpdateCriterion()
{
// this doesn't work because the compiler doesn't know if T has Id & CompanyId
return e => new { e.Id, e.CompanyId };
}
问题是,T 没有超类型可以用来从中提取Id 和CompanyId,我必须动态进行。感谢对那个引用问题的回答,我已经成功地为一个属性(e => e.Id)构建并使用了这种方法,但是我在为两个属性实现它时遇到了问题。只是为了可见性,一个领域的解决方案是:
public virtual Expression<Func<T, object>> UpdateCriterion()
{
var param = Expression.Parameter(typeof(T));
var body = Expression.Convert(Expression.Property(param, "ID"), typeof(object));
return Expression.Lambda<Func<T, object>>(body, param);
}
我已经为此发疯了 6 个多小时......那么,我该如何解决这个问题?
【问题讨论】:
-
您对那些
T子类有任何控制权吗?设置界面会以最优雅的方式解决问题。 -
我已经在另一个问题中详细解释过,但简而言之,不,这行不通,因为并非所有人都有这些字段,所以有些类会覆盖它,有些则不会。我需要这个作为基础实现。
-
这真的是你的工作代码吗?它不会为我编译...
-
是的。你得到什么错误?
-
如果它们没有相同的字段集,那么您可能只需要几个接口(例如
ISomethingWithId、ISomethingWithIdAndCompanyId等)。在我看来,就代码复杂性而言,反射对于几乎所有事情来说都是相当昂贵的解决方案。