Подтвердить что ты не робот

Как проверить, открыт ли сетевой ресурс

Для объекта PropertyInfo, как я могу проверить, что средство настройки свойства является общедоступным?

4b9b3361

Ответ 1

Проверьте, что вы вернетесь из GetSetMethod:

MethodInfo setMethod = propInfo.GetSetMethod();

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

Или, чтобы по-другому ответить на ответ Ричарда:

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

Обратите внимание: если все, что вы хотите сделать, это установить свойство, пока оно имеет сеттер, вам фактически не нужно заботиться о том, является ли сеттер общедоступным. Вы можете просто использовать его, общедоступный или закрытый:

// 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

Свойства .NET - действительно оболочка оболочки вокруг метода get и set.

Вы можете использовать метод GetSetMethod в PropertyInfo, возвращая MethodInfo, ссылаясь на установщик. Вы можете сделать то же самое с GetGetMethod.

Эти методы возвращают значение null, если геттер/сеттер не является общедоступным.

Правильный код здесь:

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

Ответ 3

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 a setter
                Console.WriteLine(setter.IsPublic);
            }
        }
    }
}

Ответ 4

Для определения доступности вам необходимо использовать метод underling, используя 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;

Обратите внимание, однако, что геттер и сеттер могут иметь различные возможности, например:

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

Поэтому вы не можете предположить, что получатель и сеттер будут иметь одинаковую видимость.