1

如果一个类只包含字符串数组变量,有没有一种简单的方法来初始化它们而不必一遍又一遍地键入相同的代码?

例如,如果我有类似的东西

[Serializable]
public class ReadDiagnosticEntirePointValuesResponse
{
    public string[] pointidentifier;
    public string[] presentvalue;
    public string[] priorityarray;
    public string[] alarmstate;
    public string[] outofservice;
    public string[] correctvalue;
    public string[] affect;
    public string[] covenable;
    public string[] covincrement;
    public string[] covtarget;
    public string[] covlifetime;
    public string[] historyenable;
    public string[] historyincrement;
    public string[] elapsedactivetime;
    public string[] feedbackvalue;
    public string[] rawvalue;
    ...//A lot more 
}

我想给他们赋值,我想避免这样做:

        ReadDiagnosticEntirePointValuesResponse response = new ReadDiagnosticEntirePointValuesResponse();


        response.affect = new string[count];
        response.alarmstate = new string[count];
        response.correctvalue = new string[count];
        response.covenable = new string[count];
        response.covincrement = new string[count];
        response.covlifetime = new string[count];
        response.covtarget = new string[count];
        response.elapsedactivetime = new string[count];
        response.feedbackvalue = new string[count];
        response.historyenable = new string[count];
        response.historyincrement = new string[count];
        response.outofservice = new string[count];
        response.pointidentifier = new string[count];
        response.presentvalue = new string[count];
        response.priorityarray = new string[count];
        response.rawvalue = new string[count];
        ...

当然,我可以在构造函数中编写这些初始化,但这仍然不能让我不必手动初始化它们。

有什么好的方法可以避免这种情况?

4

7 回答 7

3

这是管理数据的一种非常糟糕的方式,但是,类似以下的方法会起作用....

foreach(var field in GetType().GetFields()) {
    if(!field.IsStatic) field.SetValue(this, new string[count]);
}

然而!我强烈建议你重新考虑这个设计。更好的机制是:

class DiagnosticPoint // TODO: rename as appropriate
{  // TODO: check these all need to be strings
    public string Affect {get;set;}
    public string AlarmState {get;set;}
    ...
    public string RawValue {get;set;}
}

并将其作为字段的数组:

public class ReadDiagnosticEntirePointValuesResponse
{
    DiagnosticPoint[] points;
    ...

然后简单地初始化数组:

points = new DiagnosticPoint[count];

并初始化每个:

for(int i = 0 ; i < count ; i++) points[i] = new DiagnosticPoint();

并通过以下方式访问:

var alarm = points[index].AlarmState;

(ETC)

于 2012-09-13T06:50:34.100 回答
1

您可以使用它Reflection来执行此操作:

public ReadDiagnosticEntirePointValuesResponse()
{
    GetType().GetFields(BindingFlags.Instance | BindingFlags.Public)
             .ToList()
             .ForEach(field => field.SetValue(this, new string[count]));
}
于 2012-09-13T06:50:05.490 回答
0

您可以使用数组列表来避免声明大小。

于 2012-09-13T06:48:54.350 回答
0

至少有一次您必须手动初始化它们。如果 C'tor 不适合您,请使用新方法进行初始化。

于 2012-09-13T06:49:34.123 回答
0

你可能想看看反射......在循环中读取类的属性

于 2012-09-13T06:49:34.757 回答
0

这听起来像是一个糟糕的类定义。也许使用 anenum可能会更好。

如果你可以从这个开始:

public enum ReadDiagnostic
{
    pointidentifier,
    presentvalue,
    priorityarray,
    alarmstate,
    outofservice,
    correctvalue,
    affect,
    covenable,
    covincrement,
    covtarget,
    covlifetime,
    historyenable,
    historyincrement,
    elapsedactivetime,
    feedbackvalue,
    rawvalue,
}

然后,您可以创建一个Dictionary<ReadDiagnostic, string[]>来保存您存储在类中的值。

您甚至可以使用 LINQ 在一行代码中创建字典:

var readDiagnosticEntirePointValues =
    typeof(ReadDiagnostic)
    .GetEnumValues()
    .Cast<ReadDiagnostic>()
    .ToDictionary(x => x, x => new string[count]);

这种方法仍然是强类型的,但比您当前的方法更容易维护。

于 2012-09-13T07:09:40.283 回答
0

您可以使用以下内容:

response.affect = response.alarmstate = response... = new string[count];

但是,使用它仍然会让您手动初始化它们。这只是一个捷径。

正如其他人可能已经建议的那样,使用Collection Classes会更容易。我会推荐一本字典。以下是如何实现它:

enum Foo { Affect, AlarmState, CorrectValue, ... }

public void InitializeArrays(int count)
{
    Dictionary<Foo, string[]> response = new Dictionary<Foo, string[]>();

    // easy initialization of string arrays
    foreach (Foo foo in Enum.GetValues(typeof(Foo)))
    {
        response.Add(foo, new string[count]);
    }

    // use this to access the string arrays
    response[Foo.Affect][0] = "test";

    if (response[Foo.CorrectValue].Length > 0) { ... }
}

或者,您也可以通过使用多维数组来实现相同的目的。

// initialize it like this
string[,] response = new string[Enum.GetValues(typeof(Foo)).Length, count];

// access it like this
response[(int)Foo.Affect, 0] = "test";
于 2012-09-13T07:14:05.073 回答