簡體   English   中英

動態列出object的內容

[英]List content of an object dynamicly

有兩種對象:

public class Toto
{
    String test1 = "";
    int test2 = 0;
}

public class Titi
{
    String testA = "";
    int testB = 0;
}

我將創建一個方法,允許我動態檢查任何 object 的內容。 例如:

public void checkDatas(Object o)

在這種方法中,我將訪問 test1 並檢查它的值,然后是 test2,然后是 testA 和 testB。 像這樣的東西(對象)Object.getMember(new Toto(), "test1")

我在反射過程中找到了一些解釋,但沒有任何效果。

有人有想法嗎?

提前致謝。

您可以使用反射來讀取(未知)對象的成員,例如:

public class Toto
{
    String test1 = "aaa";
    int test2 = 0;
}

// -------------

Toto t = new Toto();

var flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
foreach (FieldInfo field in t.GetType().GetFields(flags))
{
    Console.WriteLine(field.Name + " : " + field.GetValue(t));
}

這將產生以下 output:

test1 : aaa
test2 : 0

注意:如果您的類有私有字段,那么您必須在調用Type.GetFields()時指定正確的BindingFlags ,如上所示。

你可以做這樣的事情,但如果不知道更多關於“檢查每個成員”是什么,我真的不能幫助你更多:

public void CheckMembers(object o)
{
    foreach(var member in o.GetType().GetFields())
    {
        object value = member.GetValue(o);
    }
}

我真的不知道你為什么想要這樣的東西,如果你有,請提供該信息。 但是你不能做這樣的事情:

var type = o.GetType();
var members = type.GetMembers(BindingFlags.NonPublic|BindingFlags.Public);
foreach(var member in members)
{
    var field = type.GetField(member.Name);
    Console.WriteLine(field.GetValue(o));
}

更新:使用 MemberInfo 而不是 PropertyInfo,您仍然應該向我們提供有關您在做什么的信息。

嘗試以這種方式訪問實例:

public void checkDatas(Object o)
{
    if (o is Toto)
    {
       (o as Toto).test1 = 0;
    }

    if (o is Titi)
    {
       (o as Titi).testA = "";
    }
}

請注意,我假設這些字段是公開的。

雖然您可以使用string value = typeof(Toto).GetField("test1").GetValue(instance); 如果您知道類型,那么僅使用方法重載會更有效:

public void CheckObject(Toto toto) { }
public void CheckObject(Titi titi) { }

或者更好的是,讓兩個對象都符合一個接口,比如ICheckable ,這樣你只需要實現一個方法:

public void CheckObject(ICheckable checkable);

首先,Object 面向編程,object 不允許您任何外部資源查看其私有字段。

對於類似的需求,例如表達 object ToString() 方法的內容,可以重寫。 請記住 object 必須決定要公開哪個值。

因此,在您的情況下,您可以像這樣覆蓋 ToString 。

public override string ToString()
{
     return String.Format("Value of test1={0}\nValue of test2={1}", test1, test2);
}

或者嘗試像 RevealValues() 這樣的方法來實現接口。 在您以后可能要檢查的每個 class 中實現此接口。

首先,我會嘗試在您要檢查的對象中實現一些共性。

例如,是否需要 Toto 定義 test1 而 Titi 定義 testA? 如果 Toto 和 Titi 都定義了 test1,有可能嗎? 這樣您就可以為兩者創建通用接口:

public class Toto
{
    private string test1 = "Hello from Toto object"; 
    public string Test1 { get { return this.test1; } }
}

public class Titi
{
    private string test1 = "Hello from Titi object"; 
    public string Test1 { get { return this.test1; } }
}

現在您可以定義一個通用接口:

public interface ICheerfulObject
{
    string Test1 { get; }
}

讓你的兩個類都實現這個接口,如下所示:

public class Toto: ICheerfulObject
{
     ....
}

pulbic class Titi: ICheerfulObject
{
     ....
}

然后你可以這樣做:

public void CheckData(ICheerfulObject o)
{
    string data = o.Test1;
}

如果這種情況無效並且您確實需要使用反射,請嘗試以下操作:

 public void CheckData(object o)
 {
     PropertyInfo property = o.GetType().GetProperty("Test1");  //Get used to using public properties.
     string data = (string)property.GetValue(o, null);
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM