如何检查属性设置器是否公开

时间:2010-09-21 16:36:28

标签: c# .net reflection

给定PropertyInfo对象,我该如何检查属性的setter是否公开?

4 个答案:

答案 0 :(得分:106)

检查从GetSetMethod获取的内容:

MethodInfo setMethod = propInfo.GetSetMethod();

if (setMethod == null)
{
    // The setter doesn't exist or isn't public.
}

或者,对Richard's answer进行不同的调整:

if (propInfo.CanWrite && propInfo.GetSetMethod(/*nonPublic*/ true).IsPublic)
{
    // The setter exists and is public.
}

请注意,如果你想要做的就是设置一个属性,只要它有一个setter,你实际上不必关心setter是否是公共的。你可以使用它,public private:

// This will give you the setter, whatever its accessibility,
// assuming it exists.
MethodInfo setter = propInfo.GetSetMethod(/*nonPublic*/ true);

if (setter != null)
{
    // Just be aware that you're kind of being sneaky here.
    setter.Invoke(target, new object[] { value });
}

答案 1 :(得分:9)

.NET属性实际上是围绕get和set方法的包装shell。

您可以在PropertyInfo上使用GetSetMethod方法,返回引用setter的MethodInfo。您可以使用GetGetMethod执行相同的操作。

如果getter / setter是非公共的,这些方法将返回null。

这里的正确代码是:

bool IsPublic = propertyInfo.GetSetMethod() != null;

答案 2 :(得分:4)

public class Program
{
    class Foo
    {
        public string Bar { get; private set; }
    }

    static void Main(string[] args)
    {
        var prop = typeof(Foo).GetProperty("Bar");
        if (prop != null)
        {
            // The property exists
            var setter = prop.GetSetMethod(true);
            if (setter != null)
            {
                // There's a setter
                Console.WriteLine(setter.IsPublic);
            }
        }
    }
}

答案 3 :(得分:1)

您需要使用基础方法来使用PropertyInfo.GetGetMethod()PropertyInfo.GetSetMethod()来确定辅助功能。

// Get a PropertyInfo instance...
var info = typeof(string).GetProperty ("Length");

// Then use the get method or the set method to determine accessibility
var isPublic = (info.GetGetMethod(true) ?? info.GetSetMethod(true)).IsPublic;
然而,请注意,吸气剂和吸气剂是setter可能具有不同的可访问性,例如:

class Demo {
    public string Foo {/* public/* get; protected set; }
}

所以你不能假设getter和setter具有相同的可见性。