输入内省 - 获取属性或字段信息

时间:2012-12-13 09:18:49

标签: c# .net polymorphism system.reflection

如果您确实需要获取所需信息,请fieldpropertie values / names

如何使用System.Reflection

 
public class anyClass
{
    public const string UserID  = "usrID",
                        UserName = "usrName";
}

所以它发生了,因为我真的想知道是否可以避免使用reflection

我进行了一些研究,并且......我认为,使命的正确术语是

Type introspection 专用标记未在SO中退出

Introspection不应与reflection

混淆

更进了一步,是程序操纵值的能力,

运行时properties的元数据,functions和/或object

通过使用系统反映,我可以访问Fields - values,如下例代码:

 
    var ac = new anyClass();
    public List<string> anyClassFieldsValuesList()
    {
      // sorry this was the one for the class above
      return typeof(anyClass).GetFields()
                     .Select(f =>f.GetValue(ac).ToString()).ToList<string>();


     // this would do for nested class
     // return typeof(anyClass).GetNestedTypes()
                    .First(t => String.Compare(t.Name, "anyNested", true) == 0)
                    .GetFields()
                    .Select(f => f.GetValue(ac).ToString())
                    .ToList<string>();
    }

.net是否为我们提供了使用工具或其他方法来以较少的昂贵的方式获取信息?

2 个答案:

答案 0 :(得分:2)

强调昂贵的表明性能是您的主要关注点。如果是这种情况,那里有一些库可以通过缓存元数据和元编程来消除反射的开销。但他们的意图往往非常具体。

例如,FastMember将有助于了解成员的存在,并允许访问其值(没有通常相关的反射开销),但是:它没有帮助GetNestedTypes位。

例如,要根据ac实际 的内容获取给定对象的所有值:

// requires FastMember
var accessor = TypeAccessor.Create(ac.GetType());
var values = accessor.GetMembers()
        .Select(member => accessor[ac, member.Name]).ToList();

答案 1 :(得分:0)

看起来你需要dynamic类型