Выполнение прототипа универсального делегата - PullRequest
1 голос
/ 12 апреля 2011

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

Моя идея проистекает из моего текущего проекта переписывания наших веб-служб aspx в службу WCF, где все методы имеют единый шаблон кода котла, исключая запрос на обслуживание. Статических методов в настоящее время не существует в наших существующих объектах, так как большая часть логики находится внутри самого метода веб-службы, но должна легко передаваться.

Ниже приведен пример того, что у меня есть.

[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 Ответ

2 голосов
/ 12 апреля 2011

Мне кажется, что преимущество * при вызове через ваш метод состоит в том, чтобы преобразовать любое исключение в 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));
}

(я надеюсь, что в реальном коде у вас есть некоторые записи дляисключительная ситуация, кстати)

...