2017-04-13 9 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. 1種類、そして一つの値 2.一種類、複数の値を返すと 3.複数のタイプと複数の値を返します複数のフィルタ

タイプは常にenumの一部で、最後の値は文字列である必要がありますが、メソッドを呼び出す前に値/配列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は文字列、カスタムクラス、datetime、intになります。 – Nerf

関連する問題