【问题标题】:Inheritance and attribute values继承和属性值
【发布时间】:2009-05-18 19:53:33
【问题描述】:

我正在使用代表 pdf 的类填充 PDF 应用程序。我在 pdf 上的每个文本框都有一个属性,并且正在使用属性来指定属性映射到的 pdf 文本框。我所有的 PDF 都具有相同的属性,但 pdf 对文本框使用不同的名称。所以,我能想到的唯一解决方案是创建一个基类,让每个应用程序类型扩展我的基类并覆盖每个属性,以便在其上抛出新的属性值。有没有更简单的方法?

示例(请注意,Application1 和 Application2 之间的唯一区别是 ITextField 值从“TextBox1”更改为“TextBox2”:

public class Application
{
    private string accountNumber;
    public virtual string AccountNumber
    {
        get { return this.accountNumber; }
        set { this.accountNumber = value; }
    }
}

public class Application1 : Application
{
    [ITextField("TextBox1")]
    public override string AccountNumber
    {
        get
        {
            return base.AccountNumber;
        }
        set
        {
            base.AccountNumber = value;
        }
    } 
}

public class Application2 : Application
{
    [ITextField("TextBox2")]
    public override string AccountNumber
    {
        get
        {
            return base.AccountNumber;
        }
        set
        {
            base.AccountNumber = value;
        }
    }
}

谢谢

【问题讨论】:

    标签: c# inheritance


    【解决方案1】:

    如果您要使用属性,我会说基类不是正确的选择。要定义这样的方案,我会选择接口而不是基类。需要维护的代码更少,并且可以为您带来相同的效果。

    public interface IApplication
    {
        string AccountNumber { get; set; }        
    }
    
    public class Application1 : IApplication
    {
        [ITextField("TextBox1")]
        public string AccountNumber { get; set; }
    }
    
    public class Application2 : IApplication
    {
        [ITextField("TextBox2")]
        public override string AccountNumber { get; set; }
    }
    

    此外,您可以使用基类的想法来包含一个将属性映射到文本字段的字典,然后在派生类中进行设置...这只有在每个都有大量属性时才会真正有效您需要为其执行此操作的表单。

    public abstract class Application
    {
        public Application() { }
    
        private Dictionary<string, string> mappings = new Dictionary<string, string>();
    
        public Dictionary<string, string> Mappings
        {
            get { return mappings; }
        }
    
        public string AccountNumber { get; set; }
    
        protected abstract void ProvideMappings();        
    }
    
    
    public class Application1 : Application
    {
        protected override void ProvideMappings()
        {
            Mappings.Add("AccountNumber", "TextBox1");
        }
    }
    
    public class Application2 : Application
    {
        protected override void ProvideMappings()
        {
            Mappings.Add("AccountNumber", "TextBox2");
        }
    }
    

    真的需要更多的上下文来说明哪些是好主意。用例将推动细节。例如,如果字典将 PropertyInfo 映射到 PDF 字段的字符串名称,它可能会为您提供更多帮助,这取决于您如何使用它。

    【讨论】:

    • 我有 6 个不同的应用程序,每个应用程序大约有 120 个字段。我想我会走基层路线。我喜欢只需要为每个提供映射的想法。另外,我只需要编写代码在基类中定义和设置一次属性。
    【解决方案2】:

    我知道这是一个糟糕的答案,但这似乎是一个很好的方法。它也应该适用于未来的变化。

    【讨论】:

      【解决方案3】:

      如果该值确实是系统的一部分,那么也许将其作为属性:

      public string AccountNumber {get;set;}
      public string AccountNumberTextField {get;set;}
      

      然后您可以拥有两个具有不同属性的Application 实例(相同类型)。这真的取决于上下文。

      Eric Lippert 有一篇关于何时(以及不)使用属性的好博客:Properties vs. Attributes

      【讨论】:

      • 我觉得这也是一个很好的答案……就看他怎么用了。
      猜你喜欢
      • 2010-10-05
      • 2010-09-19
      • 1970-01-01
      • 2014-02-03
      • 2021-11-12
      • 2013-11-28
      • 2011-04-16
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多