所以我有一个应用程序调用WebServices的LOAD,所有这些都有一个响应类,每个响应类都派生自ResponseBase
public abstract record ResponseBase<T>
{
public HashSet<string> ErrorMessages { get; set; }
public bool Success { get; set; }
public virtual string Message => Success ? "Success" : string.Join(", ", ErrorMessages);
public IEnumerable<T> Results { get; set; }
public T Result { get; set; }
}
现在我正在创建这样的新回复:
var results = SomeService.GetSomeResults();
return new SomeDerivedResponse() { Success = true; Results = results }
为了简洁、清晰、总体代码整洁,我喜欢做的更像是:
var results = SomeService.GetSomeResults();
return new SomeDerivedResponse().WithSuccess(results);
WithSuccess() 只会相应地分配 Success = true 和 Results = results
无需在每个派生响应类(有数百个)中放置相同的 WithSuccess() 方法。我几乎在基类中使用通用的 WithSuccess() 方法,但它返回基类,而不是派生类,这意味着我有这个双重考虑:
return new SomeDerivedResponse().WithSuccess<SomeDerivedResponse>(results);
有什么方法可以告诉编译器推断是什么,或者有更好的方法吗?
使用像这样的通用扩展方法应该可行:
public static class Ext
{
public static T WithSuccess<T, R>(this T t, IEnumerable<R> r) where T : ResponseBase<R>
{
// your logic here
return t;
}
public static T WithSuccess<T, R>(this T t, R r) where T : ResponseBase<R>
{
// your logic here
return t;
}
}
及用法:
public record SomeDerivedResponse : ResponseBase<int>{}
public record SomeDerivedResponse1<T> : ResponseBase<T>{}
new SomeDerivedResponse().WithSuccess(new []{1});
new SomeDerivedResponse1<int>().WithSuccess(1);