Исключить свойство из getType (). GetProperties () - PullRequest
23 голосов
/ 12 января 2010

Привет, я работаю в библиотеке классов с использованием C #, и у меня есть несколько классов с некоторыми свойствами.

Я просто хочу знать, могу ли я добавить что-то, чтобы исключить некоторые свойства из getType().GetProperties().

Пример того, что я хочу:

class Test
{
    public string one { get; set; }
    public string two {get ; set;}
}

и если я сделаю это:

static void Main(string[] args)
{

       Test t = new Test();
       Type ty = t.GetType();
       PropertyInfo[] pinfo = ty.GetProperties();

       foreach (PropertyInfo p in pinfo)
       {
           Console.WriteLine(p.Name);
       }
  }

Я хочу, чтобы результат был примерно таким:

one

или только одно из свойств.

Можно ли сделать что-то подобное? я не знаю, есть ли какие-нибудь модификаторы или аннотации в C #, которые позволяют мне делать то, что я хочу.

Спасибо.

Ответы [ 6 ]

29 голосов
/ 12 января 2010

Методы расширения и атрибуты помогут вам:

public class SkipPropertyAttribute : Attribute
{
}

public static class TypeExtensions
{
    public static PropertyInfo[] GetFilteredProperties(this Type type)
    {
        return type.GetProperties().Where(pi => pi.GetCustomAttributes(typeof(SkipPropertyAttribute), true).Length == 0).ToArray();
    }       
}

public class Test
{
    public string One { get; set; }

    [SkipProperty]
    public string Two { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var t = new Test();
        Type ty = t.GetType();

        PropertyInfo[] pinfo = ty.GetFilteredProperties();
        foreach (PropertyInfo p in pinfo)
        {
            Console.WriteLine(p.Name);
        }

        Console.ReadKey();
    }
}

UPDATE:

Немного более элегантная реализация GetFilteredProperties (спасибо Марку Гравеллу ):

public static class TypeExtensions
{
    public static PropertyInfo[] GetFilteredProperties(this Type type)
    {
        return type.GetProperties()
              .Where(pi => !Attribute.IsDefined(pi, typeof(SkipPropertyAttribute)))
              .ToArray();
    }
}
5 голосов
/ 12 января 2010

Вы можете добавить пользовательский атрибут для вашего типа.

public class DoNotIncludeAttribute : Attribute
{
}

public static class ExtensionsOfPropertyInfo
{
    public static IEnumerable<T> GetAttributes<T>(this PropertyInfo propertyInfo) where T : Attribute
    {
        return propertyInfo.GetCustomAttributes(typeof(T), true).Cast<T>();
    }
    public static bool IsMarkedWith<T>(this PropertyInfo propertyInfo) where T : Attribute
    {
        return property.GetAttributes<T>().Any();
    }
}
public class Test
{
    public string One { get; set; }

    [DoNotInclude]
    public string Two { get; set; }
}

Затем во время выполнения вы можете искать свойства, которые не скрыты.

foreach (var property in properties.Where(p => !p.IsMarkedWith<DoNotIncludeAttribute>())
{
    // do something...
}

Это не будет действительно скрыто, но не будет отображаться в перечислении.

1 голос
/ 12 января 2010

Я не уверен, что домен здесь, поэтому я выхожу на конечность ...

Обычно вы хотите использовать Attribute s, чтобы пометить свойства , чтобы включить в поиск метаданных, а не наоборот.

0 голосов
/ 14 февраля 2019

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

Вот пример:

PropertyInfo[] properties = record.GetType().GetProperties().Where(p => !"Description".Equals(p.Name)).ToArray();

Это исключит любые свойства с именем «Описание». Если вы не можете изменить класс, содержащий свойства, это может быть вариантом. Опять же, я предпочитаю путь атрибута, упомянутый выше.

0 голосов
/ 12 января 2010

Не думаю, что вы можете сделать это напрямую, но вы можете добавить свои собственные атрибуты и отфильтровать их самостоятельно ...

0 голосов
/ 12 января 2010

С помощью объекта PropertyInfo вы можете проверить GetCustomAttributes свойства. Таким образом, вы можете добавить атрибуты к своим свойствам при их объявлении, а затем, когда вы отражаете свойства, вы можете выбрать только те свойства, которые отмечены теми атрибутами, которые вы хотите.

Конечно, если вы на самом деле хотите каким-то образом помешать кому-либо рефлекторно получить вашу собственность, это не то решение, которое вам нужно.

Редактировать: Извините, что вы хотите GetCustomAttributes, исправлено. Видеть это: http://msdn.microsoft.com/en-us/library/kff8s254.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...