Как получить экземпляр из строки в C #? - PullRequest
1 голос
/ 14 ноября 2009

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

Пример:

string s = "label1.text";
string value = "new value";

label1.text = value; <--and some code that makes this

Как это сделать?

Ответы [ 6 ]

4 голосов
/ 14 ноября 2009

Исходя из этого источника , эквивалент

shipment.<propName> = valueToUse,

где 'propName' - это имя свойства, представленное в виде строки:

using System;
using System.Reflection;

namespace PropertyViaString
{
    public class Shipment
    {
        public string Sender { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Shipment shipment = new Shipment();
            SetValueExample(shipment, "Sender", "Popeye");
            Console.WriteLine("Sender is {0}", shipment.Sender);
            Console.ReadKey();
        }

        static void  SetValueExample(Shipment shipment, string propName, string valueToUse)
        {
            Type type = shipment.GetType();
            PropertyInfo senderProperty = type.GetProperty(propName);
            senderProperty.SetValue(shipment, valueToUse, null);
        }

    }
}

печать

Sender is Popeye
4 голосов
/ 14 ноября 2009

Вы можете использовать отражение, чтобы сделать это, но это будет довольно медленно?

Возможно, если вы расскажете нам, чего пытаетесь достичь, сделав это, мы можем помочь, есть несколько шаблонов для обработчиков событий и т. Д., Которые обычно делают это ненужным.

2 голосов
/ 14 ноября 2009

Ответ - использовать отражение. Однако существует множество платформ приложений, которые облегчают процесс намного .

Например, взгляните на Spring.Net Expressions . Это позволяет делать:

ExpressionEvaluator.SetValue(object, "label1", "text");

Он намного мощнее и гибче, чем этот простой пример, поэтому взгляните.

1 голос
/ 14 ноября 2009

Если данный элемент управления является переменной экземпляра в вашей форме (если вы использовали встроенный дизайнер WinForms, большинство из них), сначала получите элемент управления, а затем установите для него свойство:

    void Form_SetControlProperty(
        String controlName, String propertyName, object value)
    {
        FieldInfo controlField = this.GetType().GetField(controlName, 
            BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
        object control = controlField.GetValue(this);
        PropertyInfo property = control.GetType().GetProperty(propertyName);
        property.SetValue(control, value, new object[0]);
    }

Вам может понадобиться настроить BindingFlags, чтобы заставить это работать.

Это должен быть метод в вашей форме. Назовите это как: SetControlProperty («myLabel», «Text», «текст моей метки»);

Обратите внимание на область применения метода. Это любой элемент управления внутри формы, но не сама форма (для доступа к самой форме установите control в this).

Обратите внимание, что при этом используется отражение, оно будет медленным и ломким (измените имя элемента управления, и оно сломается).

1 голос
/ 14 ноября 2009

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

Label myLabel = new Label();
string s = "text";
string value = "new value";
System.Reflection.PropertyInfo[] properties = myLabel.GetType().GetProperties();
foreach (System.Reflection.PropertyInfo p in properties) 
{
    if(p.Name == s)
    {
         p.SetValue(myLabel, value, null);
    }
}
0 голосов
/ 14 ноября 2009

Я нашел этот код:

Object someObject = myForm; <--- want to make this Object someObject = "myForm";
String propName = "Title";
System.Reflection.PropertyInfo pi = someObject.GetType().GetProperty(propName);
pi.SetValue(someObject, "New Value", new Object[0]);

Это работает. Но что делать, чтобы можно было установить someObject в виде строки.

Object someObject = (object)"myForm" <-- this doesn't work.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...