繁体   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