0

有这两个类:

class A
{
    public A()
    {
        strA1 = "A1";
        strA2 = "A2";
        strA3 = "A3";
    }

    public string strA1 { get; set; }
    public string strA2 { get; set; }
    public string strA3 { get; set; }
}

class B
{
    public B()
    {
        strB1 = "B1";
        strB2 = "B2";
    }

    public string strB1 { get; set; }
    public string strB2 { get; set; }
}

我正在尝试找到一种方法来拥有一个方法(可能是 override toString()),该方法将根据这些类中的属性数量生成信息。

例如,结果将是:

for Class A: "{\""A1\"",\""A2\"",\""A3\""}";  // {"A1","A2","A3"}
for Class B: "{\""B1\"",\""B2\""}";           // {"B1","B2"}

如何在不为每个类编写特定代码的情况下以通用方式完成?

可能基类是开始...请告知

4

4 回答 4

3

您可以使用反射获取类型信息和公共属性值。这是一个扩展方法:

public static string ConvertToString(this object obj)
{
   Type type = obj.GetType();
   var properties = 
         type.GetProperties()
             .Where(p => p.GetGetMethod() != null)
             .Where(p => !p.GetIndexParameters().Any())
             .Select(p => p.GetValue(obj, null))
             .Select(x => String.Format("\"{0}\"", (x == null) ? "null" : x));

   return String.Format("{{{0}}}", String.Join(", ", properties));
}

用法:

string info = new A().ConvertToString();

输出:

{"A1","A2","A3"}
于 2012-12-11T10:46:27.310 回答
1

查看反射,动态读取对象的所有属性。您可以在基类中覆盖 ToString 并使用反射来输出所有道具。

public override string ToString()
{
    var props = GetType().GetProperties();
    foreach(var prop in props)
        ...
}

(未经测试,只是为了给你一个大致的想法。)

于 2012-12-11T10:42:26.093 回答
1

您可以编写一个使用反射实现这种方法的基类。

Type t = this.GetType()
foreach (PropertyInfo Info in t.GetProperties())
{
    // Property Name: Info.Name
    // Property Value: t.GetProperty(Info.Name).GetValue(this);
}
于 2012-12-11T10:44:20.567 回答
0

您可以使用 XML 序列化。

于 2012-12-11T10:45:29.977 回答