我正在使用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等。 我知道这样做的好方法吗?
答案 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>();
}
我尝试就像帕特里克霍夫曼上面所说的那样。这应该做到这一点。