基于类属性输出字符串的通用方法

时间:2012-12-11 10:37:04

标签: c#

有这两个班级:

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; }
}

我正在尝试找到一种方法来使用单一方法(可能会覆盖toString()根据这些中的属性数量生成信息类。

例如,结果将是:

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

如果不在每个类中编写特定代码,如何以通用方式完成?

可能一个基础课是首发...请告知

4 个答案:

答案 0 :(得分:3)

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

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"}

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

您可以使用反射编写实现此类方法的基类。

Type t = this.GetType()
foreach (PropertyInfo Info in t.GetProperties())
{
    // Property Name: Info.Name
    // Property Value: t.GetProperty(Info.Name).GetValue(this);
}

答案 3 :(得分:0)

您可以使用XML序列化。