代码之家  ›  专栏  ›  技术社区  ›  Ronnie Overby

如何检查属性setter是否为public

  •  51
  • Ronnie Overby  · 技术社区  · 14 年前

    给定一个propertyinfo对象,如何检查该属性的setter是否为public?

    4 回复  |  直到 7 年前
        1
  •  101
  •   Community clintgh    7 年前

    检查你从中得到什么 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是否是公共的。你可以使用它,公众 私人:

    // 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 });
    }
    
        2
  •  9
  •   David Pfeffer    14 年前

    .NET属性实际上是围绕get-and-set方法的包装外壳。

    你可以使用 GetSetMethod 方法,返回引用setter的MethodInfo。你可以用同样的方法 GetGetMethod .

    如果getter/setter不是公共的,这些方法将返回空值。

    这里的正确代码是:

    bool IsPublic = propertyInfo.GetSetMethod() != null;
    
        3
  •  4
  •   Darin Dimitrov    14 年前
    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);
                }
            }
        }
    }
    
        4
  •  1
  •   jonp    14 年前

    您需要使用下划线方法来确定可访问性,使用 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;
    

    但是,请注意,getter和setter可能具有不同的可访问性,例如:

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

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