C # Функция, которая принимает строковые параметры: как сделать рефакторинг, чтобы использовать что-то строго типизированное? - PullRequest
1 голос
/ 28 октября 2010

У меня есть этот код C #, который прекрасно работает, который берет любые два поля и помещает их в список для выпадающего списка:

var myDDL = GetDDLValues<Product>( myContact, "contactid", "companyname");

Я бы хотел, чтобы два строковых параметра принимались не в строках, а в другом. Это было бы очень приятно сделать:

GetDDLValues<Product>( myContact, p => p.contactid, p => p.companyname)

Это код, который он вызывает (отражение sweko Спасибо!):

private object GetProperty(object obj, string propertyName)
{
    PropertyInfo pi = obj.GetType().GetProperty(propertyName);
    object value = pi.GetValue(obj, null);
    return value;
}

public  IList<DDLValues> GetDDLValues<T>(IList<T> objectListToMap, 
                         string textProperty, string valueProperty)
{   
    if( objectListToMap != null && objectListToMap.Count > 0)
    {
        Mapper.CreateMap< T, DDLValues>()
              .ForMember( dest => dest.text, 
                           opt => opt.MapFrom(src => textProperty))
              .ForMember( dest => dest.value, 
                           opt => opt.MapFrom(src => valueProperty));
        return Mapper.Map<IList<T>, IList<DDLValues>>(objectListToMap);
    }
    else
    {
        return null;
    }
}

Ответы [ 3 ]

2 голосов
/ 28 октября 2010

Чтобы построить динамический запрос из строки:

public class Product 
{ 
    public long ID { get; set; } 
    public string Name { get; set; } 
    public DateTime Date { get; set; } 
} 


static void Main(string[] args) 
{ 
    List<Product> products = (from i in Enumerable.Range(1, 10) 
                          select new Product { ID = i, Name = "product " + i, Date = DateTime.Now.AddDays(-i) }).ToList();  //the test case 

    const string SortBy = "Date";  // to test you can change to "ID"/"Name" 

    Type sortType = typeof(Product).GetProperty(SortBy).PropertyType;     // DateTime 
    ParameterExpression sortParamExp = Expression.Parameter(typeof(Product), "p");    // {p} 
    Expression sortBodyExp = Expression.PropertyOrField(sortParamExp, SortBy);   // {p.DateTime} 
    LambdaExpression sortExp = Expression.Lambda(sortBodyExp, sortParamExp);   //   {p=>p.DateTime} 
    var OrderByMethod = typeof(Enumerable).GetMethods().Where(m => m.Name.Equals("OrderBy") && m.GetParameters().Count() == 2).FirstOrDefault().MakeGenericMethod(typeof(Product), sortType); 
    var result = OrderByMethod.Invoke(products, new object[] { products, sortExp.Compile() }); 
} 
1 голос
/ 28 октября 2010

tvanfosson прав, что Select() является самым простым; если вы хотите использовать AutoMapper, вы хотите что-то вроде этого ..

public  IList<DDLValues> GetDDLValues<T>(IList<T> objectListToMap, 
                         Func<T, string> textSelector, Func<T, string> valueSelector)
{   
    if( objectListToMap == null || objectListToMap.Count == 0)
        return null;

    Mapper.CreateMap< T, DDLValues>()
          .ForMember( dest => dest.text, 
                       opt => opt.MapFrom(textSelector))
          .ForMember( dest => dest.value, 
                       opt => opt.MapFrom(valueSelector));
    return Mapper.Map<IList<T>, IList<DDLValues>>(objectListToMap);
}
1 голос
/ 28 октября 2010

Если DDLValues имеет конструктор, который принимает свойства текста и значения, он должен быть относительно простым.

IList<DDLValues> GetDDLValues<T>( IList<T> source, Func<T,DDLValues> selector )
    where T : class
{
   return source.Select( selector )
                .ToList();
}

Называется

var ddlList = GetDDLValues( contacts, p => new DDLValues( c.Name, p.ContactID.ToString() ) );

Это предполагает, что DDLValues ​​имеет конструктор, подобный:

public DDLValues( string text, string value ) { ... }

Если вы извлекаете данные из базы данных в своем источнике, вам также может потребоваться материализовать запрос с помощью ToList (), прежде чем применять селектор, чтобы убедиться, что он не пытается преобразовать селектор в выражение SQL. 1011 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...