C# Language Interfaces "Hiding" members with Explicit Implementation


Don't you hate it when interfaces pollute you class with too many members you don't even care about? Well I got a solution! Explicit Implementations

public interface IMessageService {
    void OnMessageRecieve();
    void SendMessage();
    string Result { get; set; }
    int Encoding { get; set; }
    // yadda yadda

Normally you'd implement the class like this.

public class MyObjectWithMessages : IMessageService {
     public void OnMessageRecieve(){


     public void SendMessage(){


     public string Result { get; set; }
     public int Encoding { get; set; }

Every member is public.

var obj = new MyObjectWithMessages();

// why would i want to call this function?

Answer: I don't. So neither should it be declared public but simply declaring the members as private will make the compiler throw an error

The solution is to use explicit implementation:

public class MyObjectWithMessages : IMessageService{
    void IMessageService.OnMessageRecieve() {

    void IMessageService.SendMessage() {

    string IMessageService.Result { get; set; }
    int IMessageService.Encoding { get; set; }

So now you have implemented the members as required and they wont expose any members in as public.

var obj = new MyObjectWithMessages();

/* error member does not exist on type MyObjectWithMessages. 
 * We've succesfully made it "private" */

If you seriously still want to access the member even though is explicitly implement all you have to do is cast the object to the interface and you good to go.