Задать вопрос
@romaro

Можно ли получить значение свойства, прототип которого помечен в интерфейсе атрибутом?

Нет никаких проблем получить значение, если атрибут назначен свойству класса. Но как получить значение, если атрибутом помечено свойство в интерфейсе?

var c = new Test { Prop1 = "Hello" };
object? v = /*Нужно получить значение свойства c.Prop1, т.к. в интерфейсе оно помечено атрибутом [Test]*/ ;

[AttributeUsage(AttributeTargets.Property)]
internal sealed class TestAttribute : Attribute {}

internal interface ITest {
    [Test]
    string Prop1 { get; set; }
}

internal sealed class Test : ITest {
    internal string Prop1 { get; set; }
}
  • Вопрос задан
  • 36 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
VoidVolker
@VoidVolker Куратор тега C#
Dark side eye. А у нас печеньки! А у вас?
using System.Reflection;

namespace ConsoleAppTest
{
    public static class Program
    {
        private static void Main(string[] args)
        {
            Test obj = new() { Prop1 = "Prop1 Value" };
            // Получаем тип объекта
            Type objType = typeof(Test);
            // Получаем список интерфейсов
            Type[] interfaces = objType.GetInterfaces();
            foreach (Type iface in interfaces)
            {
                // Получаем список свойств интерфейса
                PropertyInfo[] ifaceProperties = iface.GetProperties();
                foreach (PropertyInfo prop in ifaceProperties)
                {
                    // Ищем нужный аттрибут в свойстве
                    Attribute? attribute = prop.GetCustomAttribute<TestAttribute>();
                    if (attribute != null)
                    {
                        // Получаем значение свойства
                        object? propValue = prop.GetValue(obj); // -> Prop1 Value
                    }
                }
            }
        }
    }
    
    [AttributeUsage(AttributeTargets.Property)]
    public sealed class TestAttribute : Attribute
    { }

    internal sealed class Test : ITest
    {
        public string Prop1 { get; set; } = string.Empty;
    }

    internal interface ITest
    {
        [Test]
        public string Prop1 { get; set; }
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы