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
(如果需要)。