内部抽象属性 - 自定义属性

时间:2012-10-30 16:11:28

标签: c# .net reflection attributes

当属性标记为内部时,我在访问抽象类中定义的属性的属性时遇到问题。以下是一些示例代码:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class CustomAttribute : Attribute
{
}

public abstract class BaseModel
{
    [CustomAttribute]
    protected DateTimeOffset GenerationTime { get { return DateTimeOffset.Now; } }

    [CustomAttribute]
    public abstract string FirstName { get; }    // Attribute found in .NET 3.5

    [CustomAttribute]
    internal abstract string LastName { get; }   // Attribute not found in .NET 3.5
}

public class ConcreteModel : BaseModel
{
    public override string FirstName { get { return "Edsger"; } }

    internal override string LastName { get { return "Dijkstra"; } }

    [CustomAttribute]
    internal string MiddleName { get { return "Wybe"; } }
}

class Program
{
    static void Main(string[] args)
    {
        ConcreteModel model = new ConcreteModel();

        var props = model.GetType().GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).ToList();
        List<PropertyInfo> propsFound = new List<PropertyInfo>(), propsNotFound = new List<PropertyInfo>();

        for (int i = props.Count - 1; i >= 0; i--)
        {
            var att = Attribute.GetCustomAttribute(props[i], typeof(CustomAttribute), true) as CustomAttribute;
            if (att != null)
                propsFound.Add(props[i]);
            else
                propsNotFound.Add(props[i]);
        }

        Console.WriteLine("Found:");
        foreach (var prop in propsFound)
        {
            Console.WriteLine(prop.Name + ": " + prop.GetValue(model, null));
        }

        Console.WriteLine(Environment.NewLine + "Not Found:");
        foreach (var prop in propsNotFound)
        {
            Console.WriteLine(prop.Name + ": " + prop.GetValue(model, null));
        }

        Console.ReadKey();
    }
}

当我在.NET 3.5上运行此程序时,找不到LastName属性上的属性,输出如下:

.NET 3.5 Output

当我在.NET 4.0上运行此程序时,可以正确找到所有属性。这是输出:

.NET 4.0 Output

这只是.NET 3.5中存在的一个错误并在.NET 4.0中得到修复吗?或者是否还有其他一些我不知道的微妙内容可以让我访问内部抽象属性的属性?

注意:仅当虚拟属性在具体类中被重写时,这似乎也是如此。

1 个答案:

答案 0 :(得分:1)

我复制了你看到的内容并查看了Microsoft Connect。没有报告的问题(公众)列出了内部的GetCustomAttribute失败问题。 但这并不意味着它没有被发现并在内部修复

您可以将其发布为连接问题(link),看看是否存在与.Net 3.5相关的热修复。