抽象通用方法以及字符串和可发送对象问题

时间:2017-04-13 14:01:44

标签: c# oop

我想构建一组方法:

我有这个摘要:

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。

1 个答案:

答案 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,如果这是您的约定所需要的,这部分有点超出您的问题范围)。