Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обращение к членам класса объекта по именам, зная имя члена установить его значение  
V
    Опции темы
Snik
Дата 16.1.2014, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 16.8.2006

Репутация: нет
Всего: нет



Добрый день!  предположим есть класс

Код

public class Products
{
   
    public string NumberProizvoditel;
    public string NumberOriginal;
   //и много других членов 

    public Products()
    {
        
    }
}


хочется какой то механизм-функцию чтобы можно было передать имя члена и установить его значение например:

Код

Products obj = new Products();
obj("NumberProizvoditel","x234");//как  то так 
//или 
SetValue(obj, name, value)//или как то так
 //пробовал и так obj["NumberProizvoditel"] = "x234"; //


не могу понять как сконструировать такой удобный механизм ?

PM MAIL   Вверх
jonie
Дата 16.1.2014, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Ну, например так:
Код

 static Action<T, TValue> GetPropertySetter<T, TValue>(string propertyName)
    {
        Type elementType = typeof(T);
        var tp = typeof(T).GetProperty(propertyName);
        ParameterExpression targetExp = Expression.Parameter(typeof(T), "target");
        ParameterExpression valueExp = Expression.Parameter(typeof(TValue), "value");

        MemberExpression propExp = Expression.Property(targetExp, tp);
        BinaryExpression assignExp = Expression.Assign(propExp, valueExp);

        var action = Expression.Lambda<Action<T, TValue>>(assignExp, targetExp, valueExp);
        return action.Compile();
    }


и использовать:
Код

  var r = GetPropertySetter<DTO, string>("MyPropertyName");
        r(dto, "134");


пойдет?

Это сообщение отредактировал(а) jonie - 16.1.2014, 11:44


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Snik
Дата 16.1.2014, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 16.8.2006

Репутация: нет
Всего: нет



не хватает ума как использовать

Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Linq.Expressions;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Products obj = new Products();
        var r = GetPropertySetter<obj, string>("NumberProizvoditel");
        r(obj, "134");

    }


    static Action<T, TValue> GetPropertySetter<T, TValue>(string propertyName)
    {
        Type elementType = typeof(T);
        var tp = typeof(T).GetProperty(propertyName);
        ParameterExpression targetExp = Expression.Parameter(typeof(T), "target");
        ParameterExpression valueExp = Expression.Parameter(typeof(TValue), "value");
        MemberExpression propExp = Expression.Property(targetExp, tp);
        BinaryExpression assignExp = Expression.Assign(propExp, valueExp);
        var action = Expression.Lambda<Action<T, TValue>>(assignExp, targetExp, valueExp);
        return action.Compile();
    }
}

PM MAIL   Вверх
jonie
Дата 16.1.2014, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



ну так тип нужен ж
Код

        var r = GetPropertySetter<Products, string>("NumberProizvoditel");


кроме того, я сделал не для fied-ов, а для property.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0427 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.