Подтвердить что ты не робот

Можно ли задать значение свойства с помощью Reflection?

Я знаю имя свойства в своем классе С#. Можно ли использовать отражение для установки значения этого свойства?

Например, скажем, я знаю, что имя свойства string propertyName = "first_name";. И там actaully существует свойство, называемое first_name. Могу ли я установить его с помощью этой строки?

4b9b3361

Ответ 1

Да, вы можете использовать отражение - просто выберите его Type.GetProperty (при необходимости указывая флаги привязки), затем вызовите SetValue соответствующим образом. Пример:

using System;

class Person
{
    public string Name { get; set; }
}

class Test
{
    static void Main(string[] arg)
    {
        Person p = new Person();
        var property = typeof(Person).GetProperty("Name");
        property.SetValue(p, "Jon", null);
        Console.WriteLine(p.Name); // Jon
    }
}

Если это не общедоступное свойство, вам нужно указать BindingFlags.NonPublic | BindingFlags.Instance в вызове GetProperty.

Ответ 2

Ниже мой тестовый фрагмент написан на С#.net

using System;
using System.Reflection;

namespace app
{
    class Tre
    {
        public int Field1 = 0;
        public int Prop1 {get;set;}
        public void Add()
        {
            this.Prop1+=this.Field1;
        }
    }
    class Program
    {

        static void Main(string[] args)
        {
            Tre o = new Tre();
            Console.WriteLine("The type is: {0}", o.GetType()); //app.Tre

            Type tp = Type.GetType("app.Tre");
            object obj = Activator.CreateInstance(tp);

            FieldInfo fi = tp.GetField("Field1");
            fi.SetValue(obj, 2);

            PropertyInfo pi = tp.GetProperty("Prop1");
            pi.SetValue(obj, 4);

            MethodInfo mi = tp.GetMethod("Add");
            mi.Invoke(obj, null);

            Console.WriteLine("Field1: {0}", fi.GetValue(obj)); // 2
            Console.WriteLine("Prop1: {0}", pi.GetValue(obj)); // 4 + 2 = 6

            Console.ReadLine();
        }
    }
}