0

这是一个有趣的概念,我不知道如何实现。(它与我需要部署装饰器模式的大学作业有关)。

我在下面编写了粗略的 C# 代码,但是它不会编译,假设我有一个类

Class A {
   public int A { get; set; }
   public string B { get; set; }
   public float C { get; set; }

   public string concatFields() {
       string sample = null;
       foreach (Field f in this) {
           sample += f.ToString();
       }
       return sample;
   }
}

你将如何实现 concatFields 方法?有没有办法遍历类的字段(不知道字段的名称)并在每个字段上调用 ​​ToString() 。

在示例 B 场景中,如果所有字段的类型相同,您将如何对它们应用相同的方法。

欢呼伙计们的帮助,我已经用 C# 标记了这个,但不确定可以应用哪些其他标记

4

4 回答 4

1

您可以使用反射,遍历类的元数据,并通过反射 API 提取字段。显然,这是有代价的:使用反射比直接访问字段要慢;有时,相当多。但是,您当然可以做到。这是一个例子:

MyClass obj = new MyClass();
// Set fields in the obj...
var fields = typeof(MyClass).GetFields(System.Reflection.BindingFlags.GetField);
StringBuilder res = new StringBuilder();
foreach (FieldInfo f in fields) {
    var val = f.GetValue(obj);
    if (val != null) res.Append(val.ToString());
}
Console.WriteLine(res.ToString());

FieldInfo类公开了许多有用的属性,例如Nameand Type,让您可以选择要在处理中包含哪些字段,以及要忽略哪些字段。

于 2012-04-22T03:17:55.187 回答
0

将您的“字段”放入字典中。

以下是迭代字典的方法:在 C# 中迭代​​字典的最佳方法是什么?

于 2012-04-22T03:11:58.433 回答
0

对于 .NET/C#,类型自省是通过System.Reflection命名空间处理的。这允许您检索有关类型的信息,并动态调用编译时未知的方法。

你将如何实现 concatFields 方法?有没有办法遍历类的字段(不知道字段的名称)并在每个字段上调用 ​​ToString() 。

public string concatFields() {
   string sample = null; // a StringBuilder would be a better choice here
   foreach (FieldInfo f in this.GetType().GetFields()) {
       obj fieldValue = f.GetValue();
       if (fieldValue != null) sample += fieldValue.ToString();
   }
   return sample;
}

在示例 B 场景中,如果所有字段的类型相同,您将如何对它们应用相同的方法。

如果您在编译时知道类型,则可以强制转换为:

foreach (FieldInfo f in this.GetType().GetFields()) {
    MyType myType = (MyType)f.GetValue();
    myType.MyMethod();
}

或者,您可以通过反射动态调用:

foreach (FieldInfo f in this.GetType().GetFields()) {
    object fieldValue = f.GetValue();
    MethodInfo mi = fieldValue.GetType().GetMethod("MyMethod");
    mi.Invoke(fieldValue, null); // no parameters to MyMethod
}
于 2012-04-22T03:24:33.810 回答
0

我会这样做:

class A

{
    public int A { get; set; }
    public string B { get; set; }
    public float C { get; set; }

    public string[] concatFields()
    {
        var v = from f in this.GetType().GetFields() select f;
        IList<string> fields = new List<string>();
        foreach (var f in v)
        {
            fields.Add(f.GetValue(this).ToString());
        }
        return fields.ToArray<string>();
    }
}
于 2012-04-22T03:30:41.983 回答