2012-01-18 13 views
5

Tengo una clase parcial generada por una herramienta.¿Cómo implementar la interfaz en la clase derivada o mediante clases parciales?

Foo.cs

public partial class Foo { 
    [SomeAttribute()] 
    public string Bar {get;set;} 
} 

necesito para implementar la siguiente interfaz para Foo sin tocar Foo.cs:

IFoo.cs

public interface IFoo { 
    string Bar {get;set;} 
} 

La extensión es Foo también una opción, pero reimplementando el Bar propiedad no es.

¿Se puede hacer esto?

+0

por qué no puedes extender Foo: IFoo, si esto es lo que estás pidiendo? – Tigran

+0

@Tigran: No puedo tocar el archivo Foo.cs – Ropstah

+0

@DBM: como se dijo en otro lugar .. 'Barra' debería ser pública – Ropstah

Respuesta

8

¿Qué le impide volver a hacer esto en otro archivo?

public partial class Foo : IFoo 
{ 
} 

Desde Bar propiedad ya existe, que no será necesario volver a implementar la misma.

O en una nueva clase

public class FooExtended : Foo, IFoo 
{ 
} 

vez más, usted no tendrá que aplicar Bar desde Foo implementa ya.

+0

Intenté esto, pero esto no compila ... – Ropstah

+1

La opción con clase parcial tiene limitación. Debe colocar el archivo en el mismo ensamblaje. La opción con clase extendida debería funcionar universalmente. ¿Cuál es el error de compilación? –

+0

No puede volver a implementar Bar de todos modos, a menos que sea virtual, por lo que esta es la forma correcta de hacerlo. – Alex

1

Puede crear una clase parcial para Foo que implemente IFoo pero con la propiedad Bar no siendo pública, no funcionará.

Si la propiedad Bar era pública:

partial class Foo 
{ 
    public string Bar { get; set; } 
} 

interface IFoo 
{ 
    string Bar { get; set; } 
} 

partial class Foo : IFoo 
{ 

} 
+0

Por favor, vea mi @Tomislav Markovski, 'Bar' debe ser público – Ropstah

1

Como Bar es privada, esto es lo que está buscando:

public partial class Foo : IFoo 
{ 
    string IFoo.Bar 
    { 
     get 
     { 
      return this.Bar; // Returns the private value of your existing Bar private field 
     } 
     set 
     { 
      this.Bar = value; 
     } 
    } 
} 

De todos modos, esto es confuso y se debe evitar si es posible.

EDITAR: Bueno, usted ha cambiado su pregunta, así como Bar ahora es público, no hay más problema que Bar siempre se implementa en Foo.