2009-05-18 86 views
1

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

例子(注意应用1和应用2之间的唯一区别是从“TextBox1的”到“TextBox2中的” ITextField价值的变化:

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; 
     } 
    } 
} 

感谢

回答

0

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

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字段的字符串名称,字典可能会帮助您更多,这取决于您如何使用它。

+0

我有6个不同的应用程序,每个应用程序大约有120个字段。我想我要去基地路线。我喜欢只需为每个映射提供映射的想法。另外,我只需要编写代码来在基类中定义和设置属性。 – Striker 2009-05-19 14:47:54

0

我知道这是一个贫穷的答案,但看起来像是一个很好的方法,它也应该适用于未来的变化

0

如果该值是系统的真正部分,那么可能将其作为属性:

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

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

埃里克利珀对时(而不是)使用属性一个好的博客:Properties vs. Attributes

+0

我认为这也是一个很好的答案......只是取决于他如何使用它。 – 2009-05-18 22:07:45