使用get/set asp.net c#的属性太多

本文关键字:属性 太多 net asp get set 使用 | 更新日期: 2023-09-27 17:58:53

我习惯于创建一个属性类,在其中我将包括所有字段,并必须写入所有的get/set属性,然后有另一个Database类,在那里我将进行所有的数据库调用。

Properties Class
    private int _intCard
    public int IntCard
    {
        set { _intcard = value;}
    }
Constructor here

现在,这感觉不是一个正确的方法,因为我有120多个属性要处理,而且似乎真的很耗时,必须写出其中的每一个属性。我需要为一些属性添加验证。这是我选择这种方式的原因,我可以在set方法中验证它。有人能提出一种替代方法吗?我可以研究一下,以完成同样的结果。

********************---------------*******************

所以,给出我理解我的设计有缺陷的评论,这就是我在这个问题中的想法。我对如何解决这个问题有一个想法,但不知道这是否是正确的方法。我搜索了对象设计原理并阅读了它,但需要更多的时间来掌握它教给我的东西。现在我想知道这种方法是否是的正确方法

我会记录申请人的姓名、地址、电话、传真号码、手机、altphone、altaddress,配偶的姓名、住址、推荐人、公司信息。。。。。等等

我不会撒谎,我还不懂抽象类,为了实现这一点,如果这是我应该采取的方法,我会花更多的时间来学习,但目前我希望这是合适的。

财产类别如下application.cs、applicationspouse.cs、applicationscontactinfo.cs、appreference.cs……

这符合我应该做的事情吗?

再次感谢

使用get/set asp.net c#的属性太多

我忍不住认为您的对象建模不正确。如果你有一个具有120个属性的类,那么你没有将该对象划分为单独的角色/职责等。我会考虑(大幅)增加你正在创建的类的数量,这样你的解决方案就会变得更易于管理。

这不会减少您必须处理的属性的数量。可能值得考虑不可变对象(在构建过程中是否需要设置这些属性?),和/或使用Builder模式来帮助构建。

最后,是否需要公开这些属性?OO的一个关键部分是告诉对象为您做事,而不是获取它们的内容并为它们做事。如果你可以告诉一个对象为你做一些事情,那么你很可能不需要公开它们的(内部)字段。

通过阅读评论,看起来你至少需要两个类Person,Address之类的:

public class Person 
{
  Guid Id {get; set;}
  string Name {get; set;}
  // ad infinitum the truely unique things that relate to an Individual
  Address BusinessAddress {get; set;}
  Address HomeAddress {get; set;}
  Person Spouse {get; set;}
}
public class Address
{
  Guid Id {get; set;}
  Line1 {get; set;}
  // ad infinitum all the truly unique things that relate to an address
}

上面的内容本质上是伪代码,不应该被解读为"这正是如何做到的",例如,我没有说明这些属性是私有/公共/受保护的,还是确实提供了构造函数。

但它确实展示了如何使用其他类作为属性,并在"配偶"的情况下创建非常丰富和深入的对象层次结构(配偶可能包含地址和可能的另一个配偶-循环引用ahoy谁的工作是成为"那个特定的东西"。这里可能值得一看OOP概念,如封装、继承等(基本上是OO的四个原则),以了解对象应该代表什么,这个链接有一个简短的介绍,应该可以帮助您决定如何分解类和构造更有用的对象。

http://codebetter.com/raymondlewallen/2005/07/19/4-major-principles-of-object-oriented-programming/

在现代c#版本中,有一个超紧凑的属性sintax:

public class Properties {
    public int IntCard { get; set; }
}

这里c为您处理私有变量,这样您就可以避免大量的击键操作。对于验证,您可以使用数据注释。更多信息点击这里

希望它能帮助

完全同意@brian agnew的观点,即如果你在一个类中有那么多属性,那么你可能需要进行一些重构,因为你几乎肯定没有足够的关注点分离。

然而,即使在进行了一些重构之后,您仍然拥有这些属性,因此值得查看数据验证属性。例如,下面是将它们与MVC一起使用的演练:http://www.asp.net/mvc/tutorials/older-versions/models-(data)/使用数据注释验证器cs进行验证。然后您可以使用自动实现的属性:

public int IntCard { get; set; }
请注意,这并不能解决您的设计问题。如果你的数据库在sql server上,为了避免键入,你可以使用这样的查询(请根据你的要求进行修改)来获得带有数据类型的属性列表,然后复制并粘贴结果。SQL SERVER演示
SELECT  'public ' + CASE DATA_TYPE WHEN 'smallint' THEN 'short' 
                WHEN 'bit' THEN 'bool'
                WHEN 'smalldatetime' THEN 'System.DateTime'
                WHEN 'datetime' THEN 'System.DateTime'
                WHEN 'date' THEN 'System.DateTime'
                WHEN 'uniqueidentifier' THEN 'System.Guid'
                WHEN 'varchar' THEN 'string'
                WHEN 'int' THEN 'int' 
                WHEN 'numeric' THEN 'decimal'
                ELSE DATA_TYPE END 
          + CASE IS_NULLABLE  WHEN 'NO' THEN '' ELSE '?' END
          + ' ' + COLUMN_NAME 
          + ' { get; set; }' AS def
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'YourTableName'
ORDER BY IS_NULLABLE, ORDINAL_POSITION

Tim,

根据你的编辑,你看起来是正确的。您应该将属性分解为特定的项目,例如:

public class Person
    {
        public string GivenName { get; set; }
        public string Surname { get; set; }
        public ContactInfo ContactInformation { get; set; }
    }
public class Applicant : Person
    {
        public Person Spouse { get; set; }
        public List<Person> Children { get; set; }
        public List<Reference> References { get; set; }
    }
public class ContactInfo
    {
        [Required]
        [DataType(DataType.PhoneNumber)]
        public string PhoneNumber { get; set; }
        [DataType(DataType.EmailAddress)]
        public string EmailAddress { get; set; }
        public Address PrimaryAddress { get; set; }
        public Address AlternativeAddress { get; set; }
    }

所以这里对你来说关键的一点是

  1. 类被分解为可管理、可重用的块
  2. 数据注释(ContactInfo类中的必需数据类型)用于验证属性
  3. 属性不再需要显式私有变量

p.S.关于数据注释的更多信息:http://msdn.microsoft.com/en-us/library/dd901590(v=vs.95).aspx