【发布时间】:2011-01-12 22:08:48
【问题描述】:
我有这些类型:
public class GenericDao<T>
{
public T Save(T t)
{
return t;
}
}
public abstract class DomainObject {
// Some properties
protected abstract dynamic Dao { get; }
public virtual void Save() {
var dao = Dao;
dao.Save(this);
}
}
public class Attachment : DomainObject
{
protected dynamic Dao { get { return new GenericDao<Attachment>(); } }
}
然后,当我运行此代码时,它会因 RuntimeBinderException 失败:'GenericDAO
var obj = new Attachment() { /* set properties */ };
obj.Save();
我已经在 DomainObject.Save() 中验证了“this”肯定是附件,所以这个错误没有任何意义。谁能解释一下为什么该方法无法解决?
更多信息 - 如果我将 DomainObject.Save() 的内容更改为使用反射,则会成功:
public virtual void Save() {
var dao = Dao;
var type = dao.GetType();
var save = ((Type)type).GetMethod("Save");
save.Invoke(dao, new []{this});
}
【问题讨论】:
-
对此进行调查。不知道原因,所以我不会作为答案发布,但我认为问题出在
this。在您的虚拟Save方法中,我使用它,添加了dynamic obj = this; dao.Save(obj);并在运行时解决。测试它以查看它在给定代码的情况下是否真正起作用。 -
@Ani,我将他的代码更新为可以编译但仍显示其运行时损坏行为的代码。这是一个有趣的问题。
-
@Anthony,您能否重新发布您的评论作为答案,以便我标记它?做动态 obj = this; 似乎确实有效dao.Save(obj);另外,任何人都可以解释为什么会这样吗?这是 DLR 中的错误吗?