具有重载方法的C#函数

具有重载方法的C#函数,c#,C#,好的,来展示我的代码是什么样子的(这是可行的,但不一定漂亮): 公共委托响应函数(参考R1 out1); 公共代表响应函数(T1输入1,参考R1输出1); 公共代表响应函数(T1输入1,T2输入2,参考R1输出1); 公共代表响应函数(T1 IN 1,T2 IN 2,T3 IN 3,参考R1 out1); 公共代表响应函数(T1 IN 1、T2 IN 2、T3 IN 3、T4 IN 4、参考R1 out1); 公共代表响应功能(T1 in1、T2 in2、T3 in3、T4 in4、T5 in5

好的,来展示我的代码是什么样子的(这是可行的,但不一定漂亮):

公共委托响应函数(参考R1 out1);
公共代表响应函数(T1输入1,参考R1输出1);
公共代表响应函数(T1输入1,T2输入2,参考R1输出1);
公共代表响应函数(T1 IN 1,T2 IN 2,T3 IN 3,参考R1 out1);
公共代表响应函数(T1 IN 1、T2 IN 2、T3 IN 3、T4 IN 4、参考R1 out1);
公共代表响应功能(T1 in1、T2 in2、T3 in3、T4 in4、T5 in5、参考R1 out1);
公共代表响应功能(T1 in1、T2 in2、T3 in3、T4 in4、T5 in5、T6 in6、参考R1 out1);
公共静态响应查询(Func方法,参考R1 out1)
{
返回QueryAll(方法,null,null,null,null,null,null,null,null,ref-out1);
}
公共静态响应查询(Func方法,T1 in1,ref R1 out1)
{
返回QueryAll(方法,in1,null,null,null,null,null,null,ref-out1);
}
公共静态响应查询(Func方法,T1 in1,t2in2,ref R1 out1)
{
返回QueryAll(方法,in1,in2,null,null,null,null,ref-out1);
}
公共静态响应查询(Func方法,T1 in1,T2 in2,T3 in3,ref R1 out1)
{
返回QueryAll(方法,in1,in2,in3,null,null,null,ref-out1);
}
公共静态响应查询(Func方法,T1 in1,T2 in2,T3 in3,T4 in4,ref R1 out1)
{
返回QueryAll(方法,in1,in2,in3,in4,null,null,ref-out1);
}
公共静态响应查询(Func方法,T1 in1,T2 in2,T3 in3,T4 in4,T5 in5,参考R1 out1)
{
返回QueryAll(方法,in1、in2、in3、in4、in5、null、ref-out1);
}
公共静态响应查询(Func方法,T1 in1,T2 in2,T3 in3,T4 in4,T5 in5,T6 in6,参考R1 out1)
{
返回QueryAll(方法in1、in2、in3、in4、in5、in6、ref-out1);
}
专用静态响应查询(委托方法,T1 in1,T2 in2,T3 in3,T4 in4,T5 in5,T6 in6,参考R1 out1)
{
尝试
{
响应=空;
//测试方法的类是否实现了ICacheable
如果(方法.GetType()是ICacheable)
{
//尝试从缓存中获取值(如果可用)
out1=((ICacheable)method.Target.Get(out1);
//如果不为null,则返回值并退出
如果(out1!=null)
返回null;
其他的
{
//值为null,但应缓存,因此请尝试加载到缓存并返回它
如果(in6!=null)
响应=((Func)方法)(in1、in2、in3、in4、in5、in6、ref-out1);
else if(in5!=null)
响应=((Func)方法)(in1、in2、in3、in4、in5、ref-out1);
else if(in4!=null)
响应=((Func)方法)(in1、in2、in3、in4、ref-out1);
else if(in3!=null)
响应=((Func)方法)(in1、in2、in3、ref-out1);
否则如果(in2!=null)
响应=((Func)方法)(in1,in2,ref-out1);
else如果(in1!=null)
响应=((Func)方法)(in1,ref out1);
其他的
响应=((Func)方法)(参考out1);
//若数据库中的值不为null,则将其保存在缓存中
如果(out1!=null)
((ICacheable)方法目标)。设置(出发1);
返回响应;
}
}
其他的
{
//从数据库获取数据
如果(in6!=null)
响应=((Func)方法)(in1、in2、in3、in4、in5、in6、ref-out1);
else if(in5!=null)
响应=((Func)方法)(in1、in2、in3、in4、in5、ref-out1);
else if(in4!=null)
响应=((Func)方法)(in1、in2、in3、in4、ref-out1);
else if(in3!=null)
响应=((Func)方法)(in1、in2、in3、ref-out1);
否则如果(in2!=null)
响应=((Func)方法)(in1,in2,ref-out1);
else如果(in1!=null)
响应=((Func)方法)(in1,ref out1);
其他的
响应=((Func)方法)(参考out1);
返回响应;
}
}
捕获(异常exc)
{
CustomException=exc.ToCustomException();
异常。代码=响应代码。未知错误;
抛出异常;
}
}
这是数据抽象层。同样,我的问题是我想允许开发人员传入一个方法和最多6个参数。但是,我只希望有一个主方法包含我的所有逻辑,以便更易于维护。然后,根据特定条件(对象是否在缓存中),调用数据层上的方法从存储库中读入对象,存储在缓存中,然后将对象返回给控制器


有比下面这样的多个if/else语句更好的方法吗?

您可以将您的业务逻辑包含在另一个方法中,该方法具有要调用的方法的参数

public static Response Query<R1>(Func<Tuple<Result, R1>> method, ref R1 @out)
{
    Tuple<Result, R1> result = Logic(() => method());
    @out = result.Item2;
    return result.Item1;
}

public static Response Query<T1, R1>(Func<T1, Tuple<Result, R1>> method, T1 a, ref R1 @out)
{
    Tuple<Result, R1> result = Logic(() => method(a));
    @out = result.Item2;
    return result.Item1;
}

public static Response Query<T1, T2, R1>(Func<T1, T2, Tuple<Result, R1>> method, T1 a, T2 b, ref R1 @out)
{
    Tuple<Result, R1> result = Logic(() => method(a, b));
    @out = result.Item2;
    return result.Item1;
}

...

public static Tuple<Result, R1> Logic<R1>(Func<Tuple<Result, R1>> doMethod)
{
    Tuple<Result, R1> result;
    // logic
    if(true) { result = doMethod(); }
    ...

    // watch out if this doesn't get assigned, can cause problems downstream
    return result;
}
公共静态响应查询(Func方法,ref R1@out)
{
元组结果=逻辑(()=>method());
@out=结果项2;
返回结果.1项;
}
公共静态响应查询(Func方法,T1 a,ref R1@out)
{
元组结果=逻辑(()=>方法(a));
@out=结果项2;
返回结果.1项;
}
公共静态响应查询(Func方法,T1 a,t2b,ref R1@out)
{
元组结果=逻辑(()=>方法(a,b));
@out=结果项2;
返回结果.1项;
}
...
公共静态元组逻辑(Func-doMethod)
{
元组结果;
//逻辑
如果(true){result=doMethod();}
...
//注意,如果未分配此任务,可能会导致下游出现问题
public static Response Query<R1>(Func<Tuple<Result, R1>> method, ref R1 @out)
{
    Tuple<Result, R1> result = Logic(() => method());
    @out = result.Item2;
    return result.Item1;
}

public static Response Query<T1, R1>(Func<T1, Tuple<Result, R1>> method, T1 a, ref R1 @out)
{
    Tuple<Result, R1> result = Logic(() => method(a));
    @out = result.Item2;
    return result.Item1;
}

public static Response Query<T1, T2, R1>(Func<T1, T2, Tuple<Result, R1>> method, T1 a, T2 b, ref R1 @out)
{
    Tuple<Result, R1> result = Logic(() => method(a, b));
    @out = result.Item2;
    return result.Item1;
}

...

public static Tuple<Result, R1> Logic<R1>(Func<Tuple<Result, R1>> doMethod)
{
    Tuple<Result, R1> result;
    // logic
    if(true) { result = doMethod(); }
    ...

    // watch out if this doesn't get assigned, can cause problems downstream
    return result;
}
public static Response Query<L1,R1>(L1 in1, ref R1 out1)
{
    // The SAME business logic with the same if/then statements
    if (true)
        out1 = method(in1, in2);
    else
        // Some other business logic
}
    public static Response Query<T1, T2, T3, T4, T5, T6, R1>(Func<T1, T2, T3, T4, T5, T6, Tuple<Response, R1>> method, T1 in1, T2 in2, T3 in3, T4 in4, T5 in5, T6 in6, ref R1 out1)
    {
        return QueryAll(() => method(in1, in2, in3, in4, in5, in6), ref out1);
    }

    private static Response QueryAll<R1>(Func<Tuple<Response, R1>> method, ref R1 out1)
    {
        try
        {
            Tuple<Response, R1> result;

            // Test if the method's class implements ICacheable
            if (method.GetType() is ICacheable)
            {
                // Try to get the value from the cache if available
                out1 = ((ICacheable)method.Target).Get<R1>(out1);

                // If not null, return the value and exit
                if (out1 != null)
                    return null;
                else
                {
                    // Value is null, but should be cached, so attempt to load to cache and return it
                    result = method();
                    out1 = result.Item2;

                    // If value from database is not null, save it in cache
                    if (out1 != null)
                        ((ICacheable)method.Target).Set<R1>(out1);

                    return result.Item1;
                }
            }
            else
            {
                // Get data from database
                result = method();
                out1 = result.Item2;

                return result.Item1;
            }
        }
        catch (Exception exc)
        {
            CustomException exception = exc.ToCustomException();
            exception.Code = ResponseCodes.UnknownError;
            throw exception;
        }
    }