Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Обращение к членам класса объекта по именам


Автор: Snik 16.1.2014, 09:27
Добрый день!  предположим есть класс

Код

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"; //


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

Автор: jonie 16.1.2014, 11:44
Ну, например так:
Код

 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");


пойдет?

Автор: Snik 16.1.2014, 16:05
не хватает ума как использовать

Код

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();
    }
}

Автор: jonie 16.1.2014, 23:20
ну так тип нужен ж
Код

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


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)