2014-01-23 51 views
0

我有一個類的System.Reflection用法

class ABC 
{ 
    Public int one = 10; 
    Public String two = "123"; 
    public override string ToString() 
    { 
    } 
} 

我的問題我想在類的字符串「ABC」字段的信息/值當過,我將創建一個類的對象。例如:

Public Class Test 
{ 
    public static void Main() 
    { 
     ABC a = new ABC(); 
     a.ToString(); 
    } 
} 

現在我在這裏創建一個對象類「ABC」的,那麼我想重寫的ToString()的方法來獲得字符串ABC類的所有字段的值。

+3

爲什麼不乾脆重寫'ABC.ToString()'返回你想要什麼? – Sean

+0

@Sean,手動返回「所需屬性」不能很好地擴展。 –

+0

@AndreiV - 誰說要保留他們? – Sean

回答

0

不知道這是你的意思;

public override ToString() 
{ 
    return string.Format("one: {1}{0}two: {2}", Environment.NewLine(), one, two); 
} 
+2

我認爲他想要一個使用反射的一般方法。 –

0

您既可以使用屬性檢索字符串,或覆蓋ToString(),兩者都顯示:

public class ABC 
{ 
    private Int32 _one = 10; 
    public Int32 One { get { return _one; } } 
    private String _two = "123"; 
    public String Two { get { return _two; } } 

    protected override ToString() 
    { 
     return _two; 
    } 
} 
+2

我不認爲這個問題重寫'ToString'。我認爲問題是「我如何使用反射來枚舉類的所有域,然後從它們中創建一個字符串」 –

1
public override string ToString() 
{ 
    Dictionary<string, string> fieldValues = new Dictionary<string, string>(); 
    var fields = this.GetType().GetFields(); 

    foreach (var field in fields) 
    { 
     fieldValues[field.Name] = field.GetValue(this).ToString(); 
    } 

    return string.Join(", ", fieldValues.Select(x => string.Format("{0}: {1}", x.Key, x.Value))); 
} 
+0

FieldInfo不會給我值,我可以從propertyInfo –

0

這應做到:

public override string ToString() { 
    string s = ""; 
    foreach(FieldInfo f in this.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public)) { 
     s += f.Name + "=" + f.GetValue(this).ToString() + "\r\n"; 
    } 
    return s; 
} 

BindingFlags.Public反映只有公衆成員。如果你想要私人會員,也可以使用BindingFlags.Private標誌。
您可以在對象初始化時使用this.GetType().GetFields(),僅調用一次。

這也適用於框架2。
將其更改爲您的需要。

0

所以,在這裏,它是:

public class ABC 
    { 
     public int one; 
     public string two; 
     public int three; 

     public override string ToString() 
     { 
      string names = String.Empty; 
      System.Reflection.FieldInfo[] infos = this.GetType().GetFields(); 

      foreach (System.Reflection.MemberInfo inf in infos) 
      { 
       if (names == String.Empty) 
       { 
        names = inf.Name; 
       } 
       else 
       { 
        names += ';' + inf.Name; 
       } 
      } 

      return names; 
     } 
    } 

享受!

0

而不是使用反射,你可以使用任何以下兩種方法之一:

1:在這裏,你可以序列化您的類對象的JSON對象這將是更具可讀性:

public override string ToString() 
    { 

     DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(ABC)); 
     string str; 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      serializer.WriteObject(stream, this); 
      stream.Position = 0; 
      using (StreamReader streamReader = new StreamReader(stream, Encoding.UTF8)) 
      { 

       str = streamReader.ReadToEnd(); 
      } 
     } 

     return str; 
} 

2 :在這裏,你可以序列化類對象到XML可以利用一些別的地方:

public override string ToString() 
    { 

     XmlSerializer s = new XmlSerializer(typeof(ABC)); 
     StringBuilder sb = new StringBuilder(); 
     var xtw = XmlTextWriter.Create(sb); 
     s.Serialize 
      (xtw, this); 

     return sb.ToString(); 
} 
0

終於得到解決我的問題:)

using System; 
using System.Reflection; 
using System.IO; 
using System.Collections.Generic; 
using System.Text; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyClass mC= new MyClass(); 
     string result = mC.ToString(); 
    } 
} 

class MyClass 
{ 
    string someValue = "One"; 
    int someValue1 = -1; 
    bool someValue2 = false; 
    float someValue3 = 2.2f; 

    public string SomeValue 
    { 
     get{ return this.someValue;} 
    } 

    public int SomeValue1 
    { 
     get { return this.someValue1; } 
    } 

    public bool SomeValue2 
    { 
     get { return this.someValue2; } 
    } 

    public float SomeValue3 
    { 
     get { return this.someValue3; } 
    } 

    public override string ToString() 
    { 
     string result = string.Empty; 
     Type type = this.GetType(); 
     PropertyInfo [] pInfo = type.GetProperties(); 

     for (int i = 0; i <= pInfo.Length-1; i++) 
     { 
      Type internalType = this.GetType(); 
      PropertyInfo pInfoObject = internalType.GetProperty(pInfo[i].Name); 
      object value = pInfoObject.GetValue(this,null); 
      result += pInfo[i].Name + " : " + value.ToString() + System.Environment.NewLine; 
     } 
     return result; 
    } 
} 
0

下面是一個其他的解決辦法,如果我們使用靜態字段和fieldsInfo:

class ReflectionTest 
{ 
    public static int Height = 2; 
    public static int Width = 10; 
    public static int Weight = 12; 
    public static string Name = "Got It"; 

    public override string ToString() 
    { 
     string result = string.Empty; 
     Type type = typeof(ReflectionTest); 
     FieldInfo[] fields = type.GetFields(); 
     foreach (var field in fields) 
     { 
      string name = field.Name; 
      object temp = field.GetValue(null); 
      result += "Name:" + name + ":" + temp.ToString() + System.Environment.NewLine; 
     } 
     return result; 
    } 

}