动态地向复杂数据类型添加属性

时间:2017-11-16 19:20:06

标签: c# class

我正在使用C#

中的某些属性开发类
public class SummaryDto
    {
        public string Name { get; set; }
        public string  GenericName { get; set; }            
        public int Data2012 { get; set; }
        public int Data2013 { get; set; }
        public int Data2014 { get; set; }
        public int Data2015 { get; set; }
        public int Data2016 { get; set; }
        public int Data2017 { get; set; }        

    }

在上面的类中,应该根据另一个只包含多年的对象中的数据动态添加属性Data2012,Data2013等。 我知道这样做的好方法吗?

4 个答案:

答案 0 :(得分:2)

public class SummaryDto
{
    public string Name {get; set;};
    public string GenericName {get; set; }
    public Dictionary<int,int> Data {get; } = new Dictionry<int,int>();
}

并添加一年的数据,如

void SetYear(int year, int n)
{
    var s = new SummaryDto();
    s.Data[year] = n;
}

如果您不想要列表,因为您对数据的返回方式有一些限制,请将列表包装在自己的类中:

class YearData 
{
    List<int, int> _data = new List<int, int>();

    public int GetYearData(int year)
    {
        AssertYearValid(year);
        return _data[year];
    }

    public void SetYearData(int year, int number)
    {
        AssertYearValid(year);
        AssertYearNumberValid(number);
        _data[year] = number;
    }

    private void AssertYearValid(int year)
    {
        if (year < 1900 || year > 2900)
        {
            throw new ArgumentException("Year is not valid.");
        }
    }
}


public class SummaryDto
{
    public string Name {get; set;};
    public string GenericName {get; set; }
    public YearData Data {get; } = new YearData();
}

并使用

进行设置
var s = new SummaryDto();
s.SetYearData(2001, 100);

答案 1 :(得分:1)

听起来你想要的就是Dictionary<K, V>。例如:

public Dictionary<int, int> Data { get; set; }

(当然,在构造函数中初始化它。)

然后“添加新年”,您只需将其添加到字典中:

someObj.Data.Add(2017, someIntValue);

基本上,只要你的名字中有一个递增计数器的变量,你可能就需要像数组,列表,字典等那样的东西。

答案 2 :(得分:1)

改为使用字典:

public class SummaryDto
{
    public string Name { get; set; }
    public string  GenericName { get; set; }            
    public Dictionary<int, int> Data { get; } = new Dictionary<int, int>();
}

然后设置如下数据:

summaryDto.Data[2017] = 1;

并按照以下方式阅读:

int value = summaryDto.Data[2017];

或者,如果您不确定那一年是否有参赛作品:

if (summaryDto.Data.TryGetValue(2017, out int value))
{
    // use value
}

答案 3 :(得分:0)

public class SummaryDto
{
    public string Name { get; set; }
    public string  GenericName { get; set; }            
    public Dictionary<int, int> Data { get; } = new Dictionary<int, int>();
}

我尝试就像帕特里克霍夫曼上面所说的那样。这应该做到这一点。