动态列出对象的内容



有两种对象:

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,您仍然应该向我们提供有关您正在做的事情的信息。

相关内容

  • 没有找到相关文章

最新更新