Исключите свойство из getType ().GetProperties ()

Привет я работаю в библиотеке классов с помощью 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#, которые позволяют мне делать то, что я хочу.

Спасибо.

25
задан Liam 18 March 2019 в 09:58
поделиться

5 ответов

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

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();
    }
}

Обновление:

Мало более элегантной реализации getFilteredProperties (благодаря Marc Gravell ):

public static class TypeExtensions
{
    public static PropertyInfo[] GetFilteredProperties(this Type type)
    {
        return type.GetProperties()
              .Where(pi => !Attribute.IsDefined(pi, typeof(SkipPropertyAttribute)))
              .ToArray();
    }
}
31
ответ дан 28 November 2019 в 21:23
поделиться

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

0
ответ дан 28 November 2019 в 21:23
поделиться
-

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

Обычно то, что вы хотите сделать, это использовать атрибут S Чтобы пометить свойства , чтобы включить в ваших метаданных поисках, а не наоборот.

1
ответ дан 28 November 2019 в 21:23
поделиться

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

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...
}

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

6
ответ дан 28 November 2019 в 21:23
поделиться

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

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

Править: Извините, вы хотите GetCustomattribute, исправлены. Посмотри это: http://msdn.microsoft.com/en-us/library/kff8s254.aspx

0
ответ дан 28 November 2019 в 21:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: