C#反射和属性:Bug?我无法解决这个问题

时间:2011-12-30 12:54:17

标签: c# reflection attributes

这是在立即控制台中:

prop.GetCustomAttributes(typeof(RequiredParameterAttribute),true)
  

{BridgeStack.DataContracts.RequiredParameterAttribute [0]}

prop.GetCustomAttributes(typeof(RequiredParameterAttribute),true).Cast<RequiredParameterAttribute>()
  

{BridgeStack.DataContracts.RequiredParameterAttribute [0]}       [BridgeStack.DataContracts.RequiredParameterAttribute []]:{BridgeStack.DataContracts.RequiredParameterAttribute [0]}

prop.GetCustomAttributes(typeof(RequiredParameterAttribute),true).Cast<RequiredParameterAttribute>().Any()
  

我在应用程序中得到了相同的结果。

prop位于Site

public class AnswerCollectionQuery : IPagedQuery, ISiteQuery, ISortableQuery, IOrderableQuery, IFilteredQuery
{
    public int? Page { get; set; }
    public int? PageSize { get; set; }
    public string Site { get; set; }

    [AllowedSortValues(QuerySortEnum.Activity, QuerySortEnum.Creation, QuerySortEnum.Votes)]
    public QuerySortEnum? Sort { get; set; }

    public object Min { get; set; }
    public object Max { get; set; }
    public DateTime? FromDate { get; set; }
    public DateTime? ToDate { get; set; }

    public QueryOrderEnum? Order { get; set; }

    public string Filter { get; set; }
}

Site反过来来自ISiteQuery

public interface ISiteQuery : IQuery
{
    [RequiredParameter]
    string Site { get; set; }
}

尴尬的部分是控制台显示属性,允许我投射它,但我根本无法检索它,我得到零作为枚举的长度,这也是.Any()失败的原因, .FirstOrDefault()会返回null.First()投掷等等。

对此类行为的任何解释?

PD:如果我在具体类中用Site装饰[RequiredAttribute],这是有效的。但是我想把它作为界面的一部分。

为清晰起见而更新

prop来自这里:

    public static IEnumerable<PropertyInfo> GetAllProperiesOfObject(object o)
    {
        const BindingFlags flags = BindingFlags.Public | BindingFlags.FlattenHierarchy | BindingFlags.Instance;
        PropertyInfo[] list = o.GetType().GetProperties(flags);

        return list;
    }

foreach (PropertyInfo prop in Utility.GetAllProperiesOfObject(entity))

prop变为Site

的情况就是这样

1 个答案:

答案 0 :(得分:2)

零是因为它返回一个零长度类型的数组,这意味着:它没有属性。您也可以使用Attribute.IsDefined(它将返回false)来查看它。

使用隐式接口实现时,类上的公共属性不会自动从它满足的接口获取属性。要查看界面上的属性,您需要使用

typeof(ITheInterface).GetProperties()

接口上的Site属性与类上的Site属性无关。如果类上的属性必须具有属性:显式添加属性。