2012-06-19 109 views
2

是否可以在C#(我認爲它不是)擴展int來實現一個接口(不創建包裝類)?擴展Int來實現c接口#

我有一個像這樣

public interface IActionLoggerObject 
{ 
    string GetForLogging(); 
} 

的接口,我想(概念),能夠做到這一點:

public class int:IActionLoggerObject 
{ 
    string IActionLoggerObject.GetForLogging() { return "s"; } 
} 

回答

8

是否有可能(我想是不是)到(在C#中)擴展「INT」來實現一個接口(不創建包裝類)?

不可以。您永遠不能更改現有類型實現的接口。

目前尚不清楚爲什麼你要這樣做,但創建包裝類幾乎肯定是前進的方向。

+5

喬恩是,當然,正確的。但是你想在這裏做什麼?你可以在Int上使用擴展方法嗎? – MNGwinn

+0

我有一個記錄方法,其中一個參數是IActionLoggerObject類型。在我使用這種日誌記錄方法時,我有時需要傳遞一個Int(或字符串),但它必須是IActionLoggerObject類型,所以我有一個包裝對象。但是我只是因爲這樣做而感到惱火,並且正在尋找一種擴展Int來實現接口的方式,以便我不需要該包裝類。 – XenoPuTtSs

+1

@XenoPuTtSs:你不能只是重載方法? –

3

正如MNGwinn在他對Jon Skeet的回答的評論中提到的,如果他們滿足您的所有要求,您可以使用擴展方法。

所以,這樣的事情:

public static class ExtensionMethods 
{ 
    public static string GetForLogging(this int @this) 
    { 
     return "s"; // or maybe return @this.ToString(); 
    } 
} 

將讓你做到這一點。

string val = 3.GetForLogging(); 
0

另一種擴展方法可能性:

public interface IActionLoggerObject 
{ 
    string GetForLogging(); 
} 

public class ActionLoggerObjectInt : IActionLoggerObject 
{ 
    public string GetForLogging() 
    { 
     return "s"; 
    } 
} 

public static class ExtensionMethods 
{ 
    public static IActionLoggerObject AsActionLoggerObject(this int i) 
    { 
     return new ActionLoggerObjectInt(); 
    } 
} 

用法:

Console.WriteLine(32.AsActionLoggerObject().GetForLogging()); 
LoggingMethod(32.AsActionLoggerObject());