2012-06-19 71 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());