[英]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.