BindingFlags.IgnoreCase对Type.GetProperty()不起作用?


183

想象以下

类型T具有字段Company。执行以下方法时,它可以完美运行:

Type t = typeof(T);
t.GetProperty("Company")

我打电话给下面的电话

Type t = typeof(T);
t.GetProperty("company", BindingFlags.IgnoreCase)

有人知道吗?


20
@OregonGhost:有关系吗?
嬉皮

9
虽然您的元问题有效,但实际上并不重要。正如我大部分问题一样,我的主要原因是对知识的渴望;)
Boris Callens

1
@leppie:是的,确实如此。也许有一个用例我不知道,为什么人们想要做某事总是很有趣。
OregonGhost,

21
@OregonGhost:并非所有针对.Net的语言都区分大小写,这就是为什么您有时需要进行不区分大小写的查找的原因。
Pop Catalin

2
我的用例:因此,我可以将对象与MSSQL Compact实体进行比较,而不必担心它们如何键入字段。(我正在将对象与紧凑型数据库进行比较,在紧凑型数据库中某些字段的名称为isSomething和IsSomething。)换句话说,出于懒惰。
teynon 2013年

Answers:


389

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


7
任何人都不知道为什么会这样(出于知识的缘故;))
Shrivallabh 2013年

2
@Shrivallabh BindingFlags.Public | 当您仅提供属性名称时,BindingFlags.Instance是默认标志
Otabek Kholikov

1
@Shrivallabh添加到OtabekKholikov的解释中,如果要保留这些默认值并将您指定的值(或)添加(或)BindingFlags到它们,则没有办法不使用默认值。即,不可能排除Public属性或排除Instance属性。他们决定您采用默认值,还是通过精确指定要使用的内容来覆盖它们。
xr280xr

36

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


2
您获得的投票较少,但您的投票速度却快了2分钟-但话又说回来,Pop的答案还有更多细节。我给所有应得的人投票!:)
Tony Basallo

10

谢谢,这真的帮了我今天的忙。我保存了审核信息,但是属性名称的大小写不正确。(审计内置在数据层中。)无论如何,我不得不将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 });
}

这是我称为DotMagic的课程的一部分。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.