Установка значения динамического свойства в C# с использованием отражения и атрибутов

В C# отражение позволяет динамически проверять типы, методы, свойства и другие члены объекта и манипулировать ими во время выполнения. В этой статье мы рассмотрим, как устанавливать значения свойств посредством отражения с использованием атрибутов. Мы обсудим несколько методов, сопровождаемых примерами кода, иллюстрирующими их.

Метод 1: использование метода SetValue()
Метод SetValue() из класса PropertyInfo позволяет нам динамически устанавливать значение свойства. Вот пример:

using System;
using System.Reflection;
public class MyClass
{
    public string MyProperty { get; set; }
}
public static void SetPropertyUsingSetValue(object obj, string propertyName, object value)
{
    Type type = obj.GetType();
    PropertyInfo propertyInfo = type.GetProperty(propertyName);
    propertyInfo.SetValue(obj, value);
}
public static void Main()
{
    MyClass myObject = new MyClass();
    SetPropertyUsingSetValue(myObject, "MyProperty", "New Value");
    Console.WriteLine(myObject.MyProperty); // Output: New Value
}

Метод 2: использование подхода на основе атрибутов
Мы можем определить пользовательские атрибуты и использовать их для динамического задания значений свойств. Вот пример:

using System;
using System.Reflection;
[AttributeUsage(AttributeTargets.Property)]
public class DefaultValueAttribute : Attribute
{
    public object DefaultValue { get; }
    public DefaultValueAttribute(object defaultValue)
    {
        DefaultValue = defaultValue;
    }
}
public class MyClass
{
    [DefaultValue("Default Value")]
    public string MyProperty { get; set; }
}
public static void SetPropertyUsingAttributes(object obj)
{
    Type type = obj.GetType();
    PropertyInfo[] properties = type.GetProperties();
    foreach (PropertyInfo property in properties)
    {
        DefaultValueAttribute attribute = property.GetCustomAttribute<DefaultValueAttribute>();
        if (attribute != null)
        {
            property.SetValue(obj, attribute.DefaultValue);
        }
    }
}
public static void Main()
{
    MyClass myObject = new MyClass();
    SetPropertyUsingAttributes(myObject);
    Console.WriteLine(myObject.MyProperty); // Output: Default Value
}

В этой статье мы рассмотрели два метода установки значений свойств посредством отражения в C#. Первый метод использует метод SetValue(), позволяющий напрямую присваивать значения. Второй метод использует пользовательские атрибуты для определения значений свойств по умолчанию и извлекает их с помощью отражения. Оба подхода обеспечивают гибкость и динамизм в манипулировании стоимостью недвижимости.