C# 如何让所有成员优雅地使用一种类型?

C# 如何让所有成员优雅地使用一种类型?,c#,reflection,C#,Reflection,我已经通过了“可能已经有你答案的问题”,但没有找到我要找的东西。 我想通过反射得到一个类型上的所有成员。当我尝试 var type = typeof(int); var members = type.GetMembers(); for(var i = 0; i < members.Length; i++) Console.WriteLine($"{i, 2} {members[i]}"); var type=typeof(int); var members=type.GetMem

我已经通过了“可能已经有你答案的问题”,但没有找到我要找的东西。 我想通过反射得到一个类型上的所有成员。当我尝试

var type = typeof(int);
var members = type.GetMembers();
for(var i = 0; i < members.Length; i++)
    Console.WriteLine($"{i, 2} {members[i]}");
var type=typeof(int);
var members=type.GetMembers();
for(var i=0;i
我有19名成员

我发现有些成员需要特定的绑定标志。因为我不知道这些标志,不同的成员有不同的标志,所以我传递所有标志,如下所示:

var type = typeof(int);
var flags =
    BindingFlags.IgnoreCase | BindingFlags.DeclaredOnly | BindingFlags.Instance |BindingFlags.Static |
    BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy | BindingFlags.InvokeMethod |
    BindingFlags.CreateInstance | BindingFlags.GetField | BindingFlags.SetField | BindingFlags.GetProperty |
    BindingFlags.SetProperty | BindingFlags.PutDispProperty | BindingFlags.PutRefDispProperty | BindingFlags.ExactBinding |
    BindingFlags.SuppressChangeType | BindingFlags.OptionalParamBinding | BindingFlags.IgnoreReturn;
var members = type.GetMembers(flags);
for(var i = 0; i < members.Length; i++)
    Console.WriteLine($"{i, 2} {members[i]}");
var type=typeof(int);
变量标志=
BindingFlags.IgnoreCase | BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Static|
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Flatterhierarchy | BindingFlags.InvokeMethod|
BindingFlags.CreateInstance | BindingFlags.GetField | BindingFlags.SetField | BindingFlags.GetProperty|
BindingFlags.SetProperty | BindingFlags.PutDispProperty | BindingFlags.PutRefDispProperty | BindingFlags.ExactBinding|
BindingFlags.SuppressChangeType | BindingFlags.OptionalParamBinding | BindingFlags.IgnoreReturn;
var members=type.GetMembers(标志);
for(var i=0;i
它给了我34个成员。这正是我需要的


但是获取所有成员的更优雅(更短)的方法在哪里呢?

您可以使用LINQ的
聚合
或所有不同的
绑定标志
值:

var flags = Enum.GetValues(typeof(BindingFlags))
                .Cast<BindingFlags>()
                .Aggregate((x,y) => x | y);
var flags=Enum.GetValues(typeof(BindingFlags))
.Cast()
.骨料((x,y)=>x | y);

定义你所说的优雅愉悦是什么意思你可以通过做
var flags=(BindingFlags)(-1)来“欺骗”它将BindingFlags中的所有位设置为1。虽然这有点令人讨厌(双关语的意思是…;),但理论上,如果设置了意外的标志,微软的实现有一天可能会改变,引发异常。确实应该在下面的答案中使用Adrian的代码。绝大多数
BindingFlags
类型无关。GetMembers()
,并且只有在指定其他搜索条件(例如
IgnoreCase
OptionalParamBinding
)或影响
InvokeMember()的行为时才执行任何操作(例如
SetField
PutDispProperty
)。在尝试查找所有成员时,唯一重要的是
Public
NonPublic
实例
静态
,以及
flatthierarchy
(如果需要)。