Использование AttributeTargets.ReturnValue
От: Zubaloo  
Дата: 24.09.09 12:38
Оценка:
Здравствуйте!

Не могло бы уважаемое сообщество рассказать как воспользоваться аттрибутом, установленым для возвращаемого значения. Ниже я приведу код в котором есть закомментированая строчка — она и является более детальным вопросом. Хотелось бы что бы свойство "IsMarked" возвращало "true" для обоих случаев.


[AttributeUsage(AttributeTargets.Class | AttributeTargets.ReturnValue)]
class MarkedAttribute : Attribute
{
}

class BaseClass
{
    public bool IsMarked
    {
        get
        {
            // Что написать здесь чтобы зацепить аттрибут установленый для возвращаемого значения?
            return Attribute.GetCustomAttribute(this.GetType(), typeof(MarkedAttribute)) != null;
        }
    }
}

[Marked]
class MyClass1 : BaseClass
{
}

class MyClass2
{
    public BaseClass Value
    {
        [return: Marked]
        get
        {
            return new BaseClass();
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        BaseClass v1 = new MyClass1();
        BaseClass v2 = new MyClass2().Value;

        Console.WriteLine(v1.IsMarked); // true
        Console.WriteLine(v2.IsMarked); // false, а хотелось бы true
    }
}
Re: Использование AttributeTargets.ReturnValue
От: gecko  
Дата: 24.09.09 12:58
Оценка:
Здравствуйте, Zubaloo, Вы писали:

Z>Здравствуйте!


Z>Не могло бы уважаемое сообщество рассказать как воспользоваться аттрибутом, установленым для возвращаемого значения. Ниже я приведу код в котором есть закомментированая строчка — она и является более детальным вопросом. Хотелось бы что бы свойство "IsMarked" возвращало "true" для обоих случаев.



Z>
Z>[AttributeUsage(AttributeTargets.Class | AttributeTargets.ReturnValue)]
Z>class MarkedAttribute : Attribute
Z>{
Z>}

Z>class BaseClass
Z>{
Z>    public bool IsMarked
Z>    {
Z>        get
Z>        {
Z>            // Что написать здесь чтобы зацепить аттрибут установленый для возвращаемого значения?
Z>            return Attribute.GetCustomAttribute(this.GetType(), typeof(MarkedAttribute)) != null;
Z>        }
Z>    }
Z>}

Z>[Marked]
Z>class MyClass1 : BaseClass
Z>{
Z>}

Z>class MyClass2
Z>{
Z>    public BaseClass Value
Z>    {
Z>        [return: Marked]
Z>        get
Z>        {
Z>            return new BaseClass();
Z>        }
Z>    }
Z>}

Z>class Program
Z>{
Z>    static void Main(string[] args)
Z>    {
Z>        BaseClass v1 = new MyClass1();
Z>        BaseClass v2 = new MyClass2().Value;

Z>        Console.WriteLine(v1.IsMarked); // true
Z>        Console.WriteLine(v2.IsMarked); // false, а хотелось бы true
Z>    }
Z>}
Z>


Невозможно. Атрибут применяется к возвращаемому значению как части определения свойства, а не к тому объекту, который возвращается.
Re: Использование AttributeTargets.ReturnValue
От: Jack128  
Дата: 24.09.09 13:01
Оценка:
Здравствуйте, Zubaloo, Вы писали:

Z>Здравствуйте!



        [AttributeUsage(AttributeTargets.Class | AttributeTargets.ReturnValue)]
        class MarkedAttribute : Attribute
        {
        }

        
        class Test
        {
            public int I
            {
                [return: Marked]
                get;
                set;
            }
        }
        static void Main(string[] args)
        {
            var t = new Test();
            var attr = Attribute.GetCustomAttribute(t.GetType().GetProperty("I").GetGetMethod().ReturnParameter, typeof(MarkedAttribute));
            Console.WriteLine(attr != null);
            Console.ReadKey(false);
        }
Re: Использование AttributeTargets.ReturnValue
От: Zubaloo  
Дата: 24.09.09 13:55
Оценка: :)
Спасибо, ответившим выше, gecko и Jack128 за их ответы — они разъяснили моё заблуждение относительно того к чему применялся атрибут. На основе разъяснений я написал следующую реализацию BaseClass (конечно решение подогнано под реализацию, но в моём случае это ОК), может кому пригодится.

class BaseClass
{
    public BaseClass()
    {
        var attribute = Attribute.GetCustomAttribute(this.GetType(), typeof(MarkedAttribute));
        if (attribute == null)
        {
            var mi = new StackTrace().GetFrame(1).GetMethod();
            if (mi is MethodInfo)
            {
                attribute = Attribute.GetCustomAttribute(((MethodInfo)mi).ReturnParameter, typeof(MarkedAttribute));
            }
        }
        this.IsMarked = (attribute != null);
    }

    public bool IsMarked
    {
        get;
        private set;
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.