Я пытаюсь написать служебный класс, который будет выполнять определенные статические методы, чтобы попытаться сократить код котла и повысить читабельность.
Моя идея проистекает из моего текущего проекта переписывания наших веб-служб 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, и что число параметров метода равно количеству передаваемых параметров, но оно не ощущается. ' сейф.
Я на правильном пути или я должен искать альтернативное решение?
На данный момент это всего лишь прототип, так как я только начинаю думать о редизайне.