Привет я работаю в библиотеке классов с помощью 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#, которые позволяют мне делать то, что я хочу.
Спасибо.
Методы и атрибуты расширения помогут вам:
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();
}
}
Я не думаю, что вы можете сделать это напрямую, но вы можете добавить свои собственные пользовательские атрибуты и фильтровать их ...
Я не уверен, что здесь домен, так что я выхожу на конечности ...
Обычно то, что вы хотите сделать, это использовать атрибут
S Чтобы пометить свойства , чтобы включить в ваших метаданных поисках, а не наоборот.
Вы можете поставить пользовательский атрибут на ваш тип.
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...
}
Это не будет очень скрыто, но он не появляется в перечислении.
С объектом PropertyInfo вы можете исследовать GetCustomattribute имущества. Таким образом, вы можете добавить атрибуты ваших свойств, когда вы объявляете их, а затем, когда вы размышляете о свойствах, вы можете выбрать только свойства, которые помечены с помощью атрибутов, которые вы хотите.
Конечно, если вы на самом деле хотите каким-то образом предотвратить речь идет о том, чтобы кто-то не обращался к получению ваших свойств, это не решение, которое вы хотите.
Править: Извините, вы хотите GetCustomattribute, исправлены. Посмотри это: http://msdn.microsoft.com/en-us/library/kff8s254.aspx