1

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

你怎么能使用System.Reflection呢?

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

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

我进行了一些研究,在我看来,我的使命的正确术语是

类型自省 (此处不存在专用标签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 是否为我们提供了使用工具或其他方法以更便宜的方式获取信息的方法?

4

2 回答 2

2

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

例如,FastMember将有助于了解存在哪些成员,并允许访问它们的值(没有通常相关的反射开销),但是:它对这一点没有帮助GetNestedTypes

例如,要根据ac实际情况从给定对象中获取所有值:

// requires FastMember
var accessor = TypeAccessor.Create(ac.GetType());
var values = accessor.GetMembers()
        .Select(member => accessor[ac, member.Name]).ToList();
于 2012-12-13T09:30:42.417 回答
0

看起来你需要 动态类型

于 2012-12-13T09:29:36.643 回答