在C#中,有没有在运行时确定类的成员?

时间:2010-07-07 15:52:07

标签: c# .net-3.5

假设我有一个名为foo的类,它有3个公共成员foo1,foo2和foo3。

现在假设我正在编写一个函数,它将类foo的实例作为参数,但是当我编写这个函数时,我不知道它有哪些公共成员。

我有办法在运行时确定它有公共成员foo1,foo2,foo3 和ONLY foo1,foo2,foo3。 IE - 找出所有公众成员是什么?

我还可以确定他们的类型吗?

6 个答案:

答案 0 :(得分:6)

嗯,这就是反思所针对的:

Type myObjectType = typeof(foo);

System.Reflection.FieldInfo[] fieldInfo = myObjectType.GetFields();
foreach (System.Reflection.FieldInfo info in fieldInfo)
   Console.WriteLine(info.Name); // or whatever you desire to do with it

答案 1 :(得分:3)

你可以使用反射:

// List all public properties for the given type
PropertyInfo[] properties = foo.GetType().GetProperties();
foreach (var property in properties)
{
    string propertyName = property.Name;
}

您应该知道在使用反射时可能会有额外的开销,因为在运行时会计算类型。

答案 2 :(得分:2)

答案 3 :(得分:2)

这是反思的工作。研究如下方法:

myFoo.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public);

这将返回该类型具有的所有公共实例方法。然后,您可以查看返回的结果并确定此类是否符合您的条件。其他类型的成员也有相同的方法,例如GetFields(...)GetProperties(...)等。

基本上你想要了解Type类,这是C#反射功能的核心。

答案 4 :(得分:0)

foreach(PropertyInfo pi in yourObject.GetType().GetProperties())
{
   Type theType = pi.PropertyType;
}

答案 5 :(得分:0)

关于MSDN的以下文章应该可以帮助您确定类型的方法