2017-04-13 74 views
0

我想建立的一套方法:摘要泛型方法和字符串和IEnumerable对象问题

我有这个抽象:

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

@DavidG说过的话。最重要的是,你的通用方法似乎有点奇特。也许退后一步,描述你打算做什么? – decPL

+0

仅英文请 – DavidG

+1

http://stackoverflow.com/questions/2873480/generic-listt-as-ienumerableobject – CodeCaster

回答

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如果这是你的约定需要什么,这部分是有点外你问题的范围)。

+0

但TValue可以是字符串,自定义类,日期时间和整型。 – Nerf