有两种对象:
public class Toto
{
String test1 = "";
int test2 = 0;
}
public class Titi
{
String testA = "";
int testB = 0;
}
我会创建一个方法,允许我动态检查任何对象的内容。例如:
public void checkDatas(Object o)
在这个方法中,我将访问test1并检查它的值,然后是test2,然后是testA和testB。像这样(Object)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));
}
这会产生以下输出:
test1 : aaa
test2 : 0
注意:如果类具有私有字段,则在调用Type.GetFields()
时必须指定正确的BindingFlags
,如上所示。
你可以这样做,但如果不知道什么是"检查每个成员",我真的帮不了你更多:
public void CheckMembers(object o)
{
foreach(var member in o.GetType().GetFields())
{
object value = member.GetValue(o);
}
}
尝试以这种方式访问instanses:
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);
首先,在面向对象编程中,对象不允许任何外部源查看其私有字段。
对于类似的需求,例如表示对象内容的ToString()方法可以被重写。请记住,对象必须决定要公开哪个值。
因此,在您的情况下,您可以像这样覆盖ToString。
public override string ToString()
{
return String.Format("Value of test1={0}nValue of test2={1}", test1, test2);
}
或者尝试使用类似RevealValues()的方法来实现接口。在以后可能要检查的每个类中实现此接口。
首先,我将尝试在要检查的对象中实现一些通用性。
例如,Toto定义test1而Titi定义testA有必要吗?如果托托和蒂蒂都定义了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);
}
我真的不知道你为什么想要这样的东西,如果你有,请提供信息。但你不能做这样的事情吗:
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,您仍然应该向我们提供有关您正在做的事情的信息。