如何遍历c#中的泛型对象属性

时间:2017-10-21 15:11:46

标签: c# .net generics backend

问题是我经常遇到一个需要遍历实例对象属性的场景作为方法调用时的另一个对象方法传入参数。如下:

//Step 1
var criteria =new Criteria();
SqlCommand cmd =SqlCommandManager.GetDataCommand("SearchOrderList");
//Step 2
//The define of the SetParameterValue method is :
//public void SetParameterValue(string paramName, object val);
cmd.SetParameterValue("@SellerID",criteria.SellerID );
cmd.SetParameterValue("@DateFrom", criteria.SentDateFrom);
cmd.SetParameterValue("@DateTo", criteria.SentDateTo);
cmd.SetParameterValue("@StartRowIndex", criteria.PagingInfo.StartRowIndex);
cmd.SetParameterValue("@PageSize", criteria.PagingInfo.PageSize);
cmd.SetParameterValue("@SortField", criteria.PagingInfo.SortField);
cmd.SetParameterValue("@SortType", criteria.PagingInfo.SortType);
//cmd.SetPa........
//Step 3
cmd.ExecuteEntityList<Model>();

如何制作灵活且可扩展的方法来简化第2步。 我有一个想法是制作一个通用的方法来解决这个问题:

public static void SetParameterValues<T>(this DataCommand cmd,T _object)
    {
        if (Object.ReferenceEquals(cmd,null))
            throw new ArgumentException("The Parameter cmd must be not null", "cmd");
        if (!object.ReferenceEquals(_object, null))
        {
            //to do ...
        }

    }

但是我很困惑我应该继续处理下一步(我做了一个扩展方法)。 那么你们能帮我看看这个问题吗?

1 个答案:

答案 0 :(得分:0)

不是将一个方法设为通用,然后以某种方式区分不同的类型,而是创建方法的重载版本

public static void SetParameterValue(this DataCommand cmd, string parameter, int value)
public static void SetParameterValue(this DataCommand cmd, string parameter, string value)
public static void SetParameterValue(this DataCommand cmd, string parameter, DateTime value)
...

E.g。

public static void SetParameterValue(this DataCommand cmd, string parameter, int value)
{
    if (Object.ReferenceEquals(cmd,null))
        throw new ArgumentException("The Parameter cmd must be not null", "cmd");
    cmd.Parameters.Add(parameter, SqlDbType.Int).Value = value;
}

但是如果你想推断参数名称,你将不得不使用另一种方法。为了能够访问属性名称,您需要一个表达式树:

public static void SetParameterValue<T>(this DataCommand cmd, Expression<Func<T>> expr)
{
    var member = expr.Body as MemberExpression;
    if (member == null)
        throw new ArgumentException("We need a member expression of type obj.PropertyName");

    var prop = member.Member as PropertyInfo;
    if (prop == null)
        throw new ArgumentException("We need a property, not a field");

    string name = prop.Name;
    T value = expr.Compile()();

    cmd.Parameters.AddWithValue("@" + name, value);
}

然后必须使用lambda表达式

调用它
cmd.SetParameterValue(() => criteria.SellerID);