是否可以根据另一个属性分配设置类属性的默认值?

时间:2015-11-19 09:59:53

标签: c# asp.net .net class generics

我的此列表包含Value属性和CharToRead 我想找到一种方法将CharToRead自动设置为Value.Length

我认为这可以通过构造函数完成,但我甚至无法创建构造函数,因为我有一个泛型类。

CLASS:

  public class HeaderType<T>
    {
        public string FieldTag { get; set; }
        public string FieldName { get; set; }
        public string Value { get; set; }
    }

public class HeaderTypeEnq<T> : HeaderType<T>
{
    public string Mandatory { get; set; }
    public string CharacterType { get; set; }
    public string FixedLength { get; set; }
    public int Position { get; set; }
    public int MaxLength { get; set; }
    public int CharToRead { get; set; }    
}

LIST:

  List<HeaderTypeEnq<dynamic>> PNListEnq = new List<HeaderTypeEnq<dynamic>>();
            PNListEnq.Add(new HeaderTypeEnq<dynamic>() { FieldTag = "PN", FieldName = "Segment Tag", Value = "PN", Mandatory = "Y", CharacterType = "A/N", Position = 0, MaxLength = 04, FixedLength = "Y", CharToRead= ?  }); // replace ? with length of Value

3 个答案:

答案 0 :(得分:3)

然后在使用者类中,您可以使用Value.Length。但是如果你仍然想使用CharToRead,这将是解决方案:

public class HeaderTypeEnq<T> : HeaderType<T>
{
    public string Mandatory { get; set; }
    public string CharacterType { get; set; }
    public string FixedLength { get; set; }
    public int Position { get; set; }
    public int MaxLength { get; set; }
    public int CharToRead
    {
        get
        {
            if (string.IsNullOrEmpty(Value))
            {
                return 0;
            }
            return Value.Length;
        }
    }
}

答案 1 :(得分:1)

根据你告诉我们的内容,我不知道一个非常好的方法,但你绝对可以拥有泛型类的构造函数,所以你可以做这样的事情(当然,无论你想要什么参数):

public class HeaderTypeEnq<T> : HeaderType<T>
{
    public HeaderTypeEnq(string value)
    {
        this.Value = value;
        this.CharToRead = this.Value.Length;
    }

    public string Mandatory { get; set; }
    public string CharacterType { get; set; }
    public string FixedLength { get; set; }
    public int Position { get; set; }
    public int MaxLength { get; set; }
    public int CharToRead { get; set; }    
}

然后你可以使用它,

PNListEnq.Add(new HeaderTypeEnq<dynamic>("PN")
    {
        FieldTag = "PN",
        FieldName = "Segment Tag",
        Mandatory = "Y",
        CharacterType = "A/N",
        Position = 0,
        MaxLength = 04,
        FixedLength = "Y"
    });

除此之外,假设您希望能够修改有问题的属性(它排除了具有自定义逻辑的getter-only属性),我能想到的唯一其他选项是修改属性的setter逻辑,但这似乎很快就会让人感到困惑。

private string _value;
public string Value
{
    get
    {
        return this._value;
    }
    set
    {
        this._value = value;
        this.CharToRead = value.Length;
    }
}

当然,这也需要修改基类(至少要修改属性virtual),这可能是也可能不可行。

答案 2 :(得分:0)

  

“我甚至无法创建构造函数,因为我有一个泛型   类“。

这是错误的,您可以创建泛型类型的实例,因此也构建了一个构造函数:

public HeaderTypeEnq<T>(string value) {
    this.Value = value;
    this.CharToRead = this.Value.Length;
}