1

我有以下课程

public class MyClass
{
  public string a {get;set;}
  public string b {get;set;}
  public string c {get;set;}
  public string d {get;set;}
  public string e {get;set;}
  ...
  ...
  public string z {get;set;}
}

和下面的字符串数组

string[] input;

我无法事先知道数组的大小。我拥有的唯一信息是它的长度在 1 到 26 之间,并且所有项目都井井有条。我需要做的是将数组项分配给类成员,如下所示。

var myvar = new MyClass();

if(input.length >= 1)
   myvar.a = input[0];
if(input.length >= 2)
   myvar.b = input[1];
...
if(input >=26)
   myvar.z = input[25];

有没有比我的方法更优雅的方法?

4

3 回答 3

4

我会把它包装在一个方法中

public string GetVal(int index){
  if(input.Length > index)
  {
    return input[index];
  }
  return null;
} 

public string a
{
  get{return GetVal(0);}
}
于 2013-04-19T03:57:52.263 回答
4

我不知道这是否会有所帮助,我也不知道我是否会认为这是“优雅的”,但是您可以像这样通过反射做一些棘手的事情:

var myVar = new MyClass();
var properties = typeof(MyClass).GetProperties().OrderBy(x => x.Name).ToArray();
for (var i = 0; i < input.Length; ++i)
{
  properties[i].SetValue(myVar, input[i]);
}
于 2013-04-19T04:05:08.627 回答
1

一种强大的方法可能是使用自定义属性来装饰您的属性,该属性指示它们对应于数组中的哪个索引(尽管这似乎比其他建议更有效)。然后,您可以使用反射通过检查属性将数组映射到属性。

public class MyClass {
    [ArrayIndex(1)]
    public string a {get; set;}

    [ArrayIndex(2)]
    public string b {get; set;}

    public void ProcessData(IEnumerable<string> input) {
        // loop through input and use reflection to find the property corresponding to the index
    }
}
于 2013-04-19T04:26:11.527 回答