2016-06-16 64 views
1

我想將我的基於Action和Func的轉換器轉換爲類,以便我可以用最少的大驚小怪將它們快速交換出來。通用抽象字符串轉換器

,這將明顯接受它們的類必須轉換存儲爲一個變量

private Converter converter; 

類定義我至今是:

public abstract class Converter<T> 
{ 
    public abstract bool Convert(string str, out T val); 
} 

public class StringToFooConverter : Converter<Foo> 
{ 
    public override bool Convert(string str, out Foo val) 
    { 
     //do the parsing here 
    } 
} 

但是我顯然不能創造一個變量抽象的泛型類轉換器沒有傳遞一個泛型到它所在的類,我想避免它。

+1

如何實現由抽象類實現的非泛型接口? – HimBromBeere

+0

@HimBromBeere我沿着這條線閱讀了一些內容,但是我很難想到一個適合的界面,我可以在沒有泛型的情況下實現它?任何想法的功能的簽名將在所述界面內? – Questioning

回答

4

創建非通用接口,並實現它在你的抽象類

interface IConverter 
{ 
    bool Convert(string str, out object val); 
} 

public abstract class Converter<T> : IConverter 
{ 
    public abstract bool Convert(string str, out T val); 
    bool IConverter.Convert(string str, out object val) 
    { 
     T result = default(T); 
     var success = this.Convert(str, out result); 
     val = result; 
     return success; 
    } 
} 

public class StringToFooConverter : Converter<Foo> 
{ 
    public override bool Convert(string str, out Foo val) 
    { 
     //do the parsing here 
    } 
} 

正如你所看到的界面,方法簡單地調用抽象(通用)之一。因此,你現在可以這樣寫:

object anyOutObject; 
IConverter myConverter = new StringToFooConverter(); 
myConverter.Convert(myString, out anyObject); 

但是因爲你不提供,你要投anyObject您的實際Foo型通用型。

+0

太棒了!我有使用對象的實現,但我無法做出最後一步。非常感激。 – Questioning

+0

剛看到你的編輯;如果我想避免轉換,那麼對於傳遞泛型類型,您會提出什麼建議? – Questioning

+1

您不能因爲接口對通用約束沒有任何線索。不過,我認爲這正是你不想使用'Converter = new StringToFooConverter()'的原因。如果你想在返回的對象上調用'Foo'的任何成員,你必須以任何方式提供'Foo'類型。因此無論是施放還是使用目前的方法。 – HimBromBeere