6

次のようなメソッドを作成したい:

var result = database.Search<EntityType>(x=>x.Name, "Entity Name field value");
result = database.Search<EntityType>(x=>x.Id, "Entity Id field value");
result = database.Search<EntityType2>(x=>x.Id, "Entity2 Id field value");
result = database.Search<EntityTypeAny>(x=>x.FieldAny, "EntityAny FieldAny value");

このメソッドを実装するにはどうすればよいですか?

4

3 に答える 3

1

私はこれしか考えられません(2つの一般的な引数があります)

    public static IEnumerable<TModel> Search<TModel, TValue>(
        Expression<Func<TModel, TValue>> expression,
        TValue value
    )
    {
        return new List<TModel>();
    }

利用方法

var result = Search<EntityType, int>(x => x.Id, 1);
var result2 = Search<EntityType, string>(x => x.Name, "The name");

TValue をオブジェクトに置き換えて、2 番目のジェネリック引数を回避できますが、私はこれに固執します。

ところで。これは、この小さなヘルパーと組み合わせてうまく機能します

public static class ExpressionHelpers
{
    public static string MemberName<T, V>(this Expression<Func<T, V>> expression)
    {
        var memberExpression = expression.Body as MemberExpression;
        if (memberExpression == null)
            throw new InvalidOperationException("Expression must be a member expression");

        return memberExpression.Member.Name;
    }
}

この例では、プロパティの名前 (ID または名前) を呼び出すことで取得できます。

var name = expression.MemberName();
于 2013-05-08T09:18:02.287 に答える
0

タイプを動的にしますか

public ReturnType Read<ReturnType>(string FieldName, object dfVal)
{
    if (Res.IsDBNull(Res.GetOrdinal(FieldName)))
        return dfVal;
    try {
        return (ReturnType)Res.GetValue(Res.GetOrdinal(FieldName));
    } catch (Exception ex) {
        return dfVal;
    }
}
于 2013-05-08T09:08:39.410 に答える