【问题标题】:Inherited properties aren't bound during databinding数据绑定期间不绑定继承的属性
【发布时间】:2010-04-01 21:16:21
【问题描述】:

我有两个接口,IAuditable 和 ITransaction。

public interface IAuditable{
    DateTime CreatedOn { get; }
    string CreatedBy { get; }
 }

public interface ITransaction : IAuditable {
    double Amount{ get; }
} 

还有一个实现ITransaction的类,调用Transaction。

public class Transaction : ITransaction{
    public DateTime CreatedOn { get { return DateTime.Now; } }
    public string CreatedBy { get { return "aspnet"; } }
    public double Amount { get { return 0; } }
}

当我将 ITransactions 列表绑定到数据网格并使用自动创建列时,只有 Amount 被绑定。看不到 CreatedBy 和 CreatedOn。有没有办法让这些值在数据绑定期间可见?

【问题讨论】:

  • IDK 如果 PropertyDescriptor 可能是一个有用的类,因为它可以用来“告诉”绑定哪些属性可用于绑定。自从我使用它已经一年多了,所以我不能确定这是否是你需要的或如何使用它。
  • 这很有趣。绑定 Transaction 对象可以正常工作,但绑定为 ITransaction 则不行。如果将 Transaction 强制转换为 ITransaction,您仍然可以访问所有属性,因为 ITransaction 继承自 IAuditable,但绑定算法不会获取这些属性。很有趣。
  • @Anthony - 这是对接口“继承”的常见误解。接口实际上并不像类那样继承。
  • @womp,是的,接口无法实现“继承”成员。有趣的是,作为开发人员,您在使用接口时可以访问继承的属性,但显然反射并不关注它。感谢您回答中的链接。

标签: c# winforms data-binding interface


【解决方案1】:

接口不定义实现 - 它们只定义必需的附加接口。

这意味着任何实现ITransaction 的类也需要实现IAuditable。这并不意味着ITransaction 也定义了IAuditable 的属性。

因此,将某些内容强制转换为 ITransaction 并未将其定义为具有 IAuditable 属性。它只是强制转换为声明“我可以执行ITransaction 中的所有方法”的合同。实现ITransaction 的任何东西也需要实现IAuditable,这并不意味着ITransaction 的定义有任何不同。

Phil Haack 对此有 a great blog post

如果您想继承所有属性,您应该使用“Is-A”关系(即抽象类),而不是“Can-do”关系(接口)。

【讨论】:

    猜你喜欢
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多