是否可以基于另一个属性为类属性赋值或设置默认值
本文关键字:属性 赋值 设置 默认值 是否 另一个 | 更新日期: 2023-09-27 18:22:41
我有这个列表,它具有Value
属性和CharToRead
我正在想办法将CharToRead
自动设置为Value.Length
我认为这可以通过构造函数来完成,但我甚至无法创建构造函数,因为我有一个泛型类。
类别:
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<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
然后在consumer类中,您可以只使用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;
}
}
}
根据你告诉我们的,我不知道有什么真正好的方法可以做到这一点,但你肯定可以在泛型类上有构造函数,所以你可以做这样的事情(当然,使用你想要的任何参数):
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属性),我能想到的唯一其他选项是修改属性的setter逻辑,但这似乎会很快变得混乱。
private string _value;
public string Value
{
get
{
return this._value;
}
set
{
this._value = value;
this.CharToRead = value.Length;
}
}
当然,这也将涉及修改基类(至少使属性virtual
),这可能可行,也可能不可行。
"我甚至无法创建构造函数,因为我有一个泛型班"
这就是为什么,你可以创建泛型类型的实例,并因此构建一个构造函数:
public HeaderTypeEnq<T>(string value) {
this.Value = value;
this.CharToRead = this.Value.Length;
}