我想构建一组方法:
我有这个摘要:
public abstract Filter<T> Create(T type, string value);
public abstract IEnumerable<Filter<T>> Create(T type, IEnumerable<object> values);
并实施:
public override Filter<DiscountFilterType> Create(DiscountFilterType type, string value)
=> new DiscountFilter {Type = type, Value = string.IsNullOrWhiteSpace(value) ? null : value};
public override IEnumerable<Filter<DiscountFilterType>> Create(DiscountFilterType type, IEnumerable<object> values)
=> values.Select(value => this.Create(type, value?.ToString())).ToList();
看起来不错,但如果我想做那样的事情:
var type = DiscountFilterType.CampaignStatus;
var values = new List<CampaignStatus>{
CampaignStatus.Active,
CampaignStatus.Accepted,
CampaignStatus.Supplement};
// Act
var result = sut.Create(ype, values);
它试图将数组发送到字符串方法。
'CS1503 Argument 2: cannot convert from 'System.Collections.Generic.List<CampaignStatus>' to 'string'
发生了什么事? 如果我想这样做:
public abstract Filter<T> Create(T type, object value);
public abstract IEnumerable<Filter<T>> Create(T type, IEnumerable<object> values);
如何?
@Edit: 我想有方法来创建过滤器,其中包括: 1.一种类型,一种价值 2.一种类型,多个值并返回多个过滤器 3.多个类型和多个值并返回多个过滤器
类型总是一些枚举,最后的值应该是字符串,但我不想在调用方法之前强制转换值/数组ToString。
答案 0 :(得分:1)
您需要一个额外的泛型参数来表示可枚举序列中值的类型(而不是使用object
)。请尝试以下抽象类型的定义:
public abstract Filter<TType, TValue> Create(TType type, TValue value);
public abstract IEnumerable<Filter<TType, TValue>> Create(TType type, IEnumerable<TValue> values);
然后,您可以将类型TValue
的实例转换为方法体中的字符串(使用ToString
,如果这是您的约定所需要的,这部分有点超出您的问题范围)。