Для объекта PropertyInfo, как я могу проверить, что средство настройки свойства является общедоступным?
Как проверить, открыт ли сетевой ресурс
Ответ 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; }
}
Поэтому вы не можете предположить, что получатель и сеттер будут иметь одинаковую видимость.