执行通用委托原型

时间:2011-04-12 15:29:36

标签: c# generics delegates prototype reusability

我正在尝试编写一个实用程序类,它将执行已定义的静态方法,以尝试减少锅炉代码并提高可读性。

我的想法源于我目前将我们的aspx Web服务重写为WCF服务的项目,其中所有方法都具有统一的锅炉代码模式,不包括服务请求。静态方法目前不存在于我们现有的对象中,因为大多数逻辑都存在于Web服务方法本身中,但应该可以轻松转移。

我到目前为止的一个例子如下。

[DataContract]
public CustomObject CreateItem(int id, string name)
{
    return ExecuteMethod<CustomObject>(CustomObject.CreateItem, id, name);
}

protected static T ExecuteMethod<T>(Delegate methodToExecute, params object[] parameters)
{
    // Do some basic logging
    // Authenticate user

    try
    {
        if (methodToExecute == null)
        {
            throw new Exception();
        }

        if (methodToExecute.Method.ReturnType != typeof(T))
        {
            throw new Exception();
        }

        if (methodToExecute.Method.GetParameters().Length != parameters.Length)
        {
            throw new Exception();
        }

        return (T)methodToExecute.Method.Invoke(methodToExecute, parameters);
    }
    catch
    {
        throw new SoapException("There was an error", SoapException.ClientFaultCode);
    }
}

public class CustomObject
{
    [DataMemeber]
    public int Id { get; set; }
    [DataMember]
    pubic string Name { get; set; }

    internal static Delegate CreateItem = new Func<int, string, CustomObject>(
        (id, name) =>
        {
            return new CustomObject() { Id = 1, Name = name };
        }
    );
}

我上面的例子应该说明我想要实现的目标。但是,我觉得这种方法到目前为止失败的原因是传递给泛型方法的参数没有输入,可能导致运行时错误(返回类型和参数类型)

我添加了一些基本检查,例如检查methodInfo的返回类型与T的类型相同,并且方法的参数数量等于传入的参数数量但是感觉不到安全”。

我是在正确的轨道上还是应该研究另一种解决方案?

这只是一个原型,因为我刚刚开始考虑重新设计。

1 个答案:

答案 0 :(得分:2)

在我看来,通过您的方法调用它的唯一的好处是将任何异常转换为SoapException。你可以更容易地做到这一点:

protected static T ExecuteMethod<T>(Func<T> function)
{
    try
    {
        return function();
    }
    catch
    {
        throw new SoapException("There was an error",
                                SoapException.ClientFaultCode);
    }
}

然后调用代码如下所示:

public CustomObject CreateItem(int id, string name)
{
    return ExecuteMethod(() => CustomObject.CreateItem(id, name));
}

(我希望在实际代码中你有一些异常情况的日志记录,顺便说一句。)