Доступ к атрибуту универсального c параметра - PullRequest
0 голосов
/ 08 января 2020

Как я могу получить доступ к атрибуту универсального c параметра? Мой код не может получить атрибут:

[AttributeUsage(AttributeTargets.GenericParameter)]
class MyAttribute : Attribute
{
    public string name;
}
class A<[MyAttribute(name = "Genric")] Type>
{
    public static void f()
    {
        MyAttribute w = Attribute.GetCustomAttributes(typeof(Type))[0] as MyAttribute; // fails
        Console.WriteLine(w?.name);
    }
}

Ответы [ 2 ]

1 голос
/ 08 января 2020

Атрибут применяется к аргументу generi c, а не к самому типу, поэтому ваш текущий подход не будет работать.

Попробуйте вместо этого:

MyAttribute w = typeof(A<>)
    .GetGenericArguments()
    .Select(t => t.GetCustomAttribute<MyAttribute>())
    .SingleOrDefault();
1 голос
/ 08 января 2020

Атрибут, который вы ищете, относится к A<>, а не Type. Таким образом, вы должны go оттуда. Посмотрите на этот пример:

using System;

public class Program
{
    public static void Main()
    {
        var genericArguments = typeof(A<>).GetGenericArguments();
        var attributes = Attribute.GetCustomAttributes(genericArguments[0]);
        Console.WriteLine((attributes[0] as MyAttribute).Name);
    }
}

[AttributeUsage(AttributeTargets.GenericParameter)]
class MyAttribute : Attribute
{
    public string Name;
}

class A<[MyAttribute(Name = "MyAttributeValue")] Type>
{
}

Вывод

MyAttributeValue

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...