Первый вопрос, который нужно задать после вопроса "Могу ли я объединить эти методы?"такое "Что общего у этих методов?"В вашем случае ответ на этот вопрос будет примерно таким:
public ObjectResult<***SomeType***> GetValues(string uRL, PortalConstant.DataSourceType DataSourceType)
{
ObjectResult<***SomeType***> ret = null;
var dataPlugin = DataPlugins.FirstOrDefault(i => i.Metadata["SQLMetaData"].ToString() == DataSourceType.EnumToString());
if (dataPlugin != null)
{
ret = dataPlugin.Value.***SomeMethod***(uRL);
}
return ret;
}
, где ***SomeType***
и ***SomeMethod***
- это два значимых различия между методами.Разберитесь с типом, сделайте метод универсальным и замените все ***SomeType***
универсальным параметром.Чтобы разобраться с методом, добавьте к нему параметр делегата.В зависимости от его использования, делегат будет иметь тип Func<PluginType, string, ObjectResult<***SomeType***>>
, где PluginType - любой тип dataPlugin.Value
.Теперь у вас есть:
public ObjectResult<T> GetValues<T>( //do come up with a better name
string uRL,
PortalConstant.DataSourceType DataSourceType,
Func<PluginType, string, ObjectResult<T>> resultSelector)
{
ObjectResult<T> ret = null;
var dataPlugin = DataPlugins.FirstOrDefault(i => i.Metadata["SQLMetaData"].ToString() == DataSourceType.EnumToString());
if (dataPlugin != null)
{
ret = resultSelector(dataPlugin.Value, uRL);
}
return ret;
}
, который изменяет GetCommissionListingRecords на (универсальный тип должен быть выведен)
GetValues(uRL, DataSourceType, (p, u) => p.GetCommissionListingRecords(u));
и аналогично для другого метода.