Здравствуйте!
Не могло бы уважаемое сообщество рассказать как воспользоваться аттрибутом, установленым для возвращаемого значения. Ниже я приведу код в котором есть закомментированая строчка — она и является более детальным вопросом. Хотелось бы что бы свойство "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
}
}
Здравствуйте, 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>
Невозможно. Атрибут применяется к возвращаемому значению как части определения свойства, а не к тому объекту, который возвращается.
Здравствуйте, 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);
}
Спасибо, ответившим выше,
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;
}
}