BindingFlags.IgnoreCase不适用于Type.GetProperty()?

Bor*_*ens 163 c# reflection getproperty bindingflags

想象一下以下内容

T型有一个现场公司.执行以下方法时,它完美地工作:

Type t = typeof(T);
t.GetProperty("Company")
Run Code Online (Sandbox Code Playgroud)

以下调用我得到了null

Type t = typeof(T);
t.GetProperty("company", BindingFlags.IgnoreCase)
Run Code Online (Sandbox Code Playgroud)

有人有个主意吗?

Pop*_*lin 358

您已经覆盖了默认的查找标志,如果指定了新标志,则需要提供所有信息以便找到属性.例如:BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance

  • 任何人都知道为什么会这样(要求知识;)) (5认同)
  • @Shrivallabh BindingFlags.Public | BindingFlags.Instance 是您仅提供属性名称时的默认标志 (2认同)
  • @Shrivallabh添加到OtabekKholikov的解释中,如果要保留这些默认值并向它们添加(或)指定的“BindingFlags”,则无法不使用默认值。即不可能排除“公共”属性或排除“实例”属性。他们决定您要么采用默认值,要么通过准确指定您想要的内容来覆盖它们。 (2认同)

lep*_*pie 29

你需要添加 BindingFlags.Public | BindingFlags.Instance

  • 你得到的票数减少了,但你快了 2 分钟 - 但话又说回来,Pop 的回答有更多细节。我给所有值得的人投票!:) (2认同)

小智 9

谢谢,这真的帮助我今天紧张.我保存了审核信息,但在属性名称上包含了错误的大小写.(审计是内置于数据层中的.)无论如何,我必须添加IgnoreCase作为绑定标志,但它仍然无法工作,直到我的同事找到了这个答案.由此产生的功能:

public static void SetProperty(Object R, string propertyName, object value)
{
    Type type = R.GetType();
    object result;
    result = type.InvokeMember(
        propertyName, 
        BindingFlags.SetProperty | 
        BindingFlags.IgnoreCase | 
        BindingFlags.Public | 
        BindingFlags.Instance, 
        null, 
        R, 
        new object[] { value });
}
Run Code Online (Sandbox Code Playgroud)

这是我称之为DotMagic的类的一部分.