2010-08-13 11 views
10

¿Hay alguna manera de hacer algo en esta línea?C# Interfaz sin tipado estático

interface Iface 
{ 
    [anytype] Prop1 { get; } 
    [anytype] Prop2 { get; } 
} 

class Class1 : Iface 
{ 
    public string Prop1 { get; } 
    public int Prop2 { get; } 
} 

class Class2 : Iface 
{ 
    public int Prop1 { get; } 
    public bool? Prop2 { get; } 
} 

No me importa el tipo de propiedades, solo necesito que las propiedades estén disponibles. Esto no tiene que implementarse con una interfaz, solo usar eso como un ejemplo.

Respuesta

25

hacer que la interfaz genérica:

interface Iface<T1,T2> 
{ 
    T1 Prop1 { get; } 
    T2 Prop2 { get; } 
} 

Alternativamente, crea las propiedades de tipo object:

interface Iface 
{ 
    object Prop1 { get; } 
    object Prop2 { get; } 
} 

Si está utilizando .NET 4.0 que incluso podría hacer que las propiedades de tipo dynamic:

interface Iface { 
    dynamic Prop1 { get; } 
    dynamic Prop2 { get; } 
} 
+0

Ninguno de los dos lograría realmente lo que se solicita con un buen motivo. Iface no sería equivalente a Iface . – Lazarus

+0

@Lazarus: si el OP espera que diferentes clases implementen * la misma interfaz * pero permiten que los campos varíen según el tipo, entonces solo la segunda y la tercera opción apoyarían eso. Sin embargo, si el OP está buscando un medio para simplemente declarar propiedades con ciertos nombres (e ignorar el tipo), entonces aún puede servir para algún propósito. En general, es un requisito inusual para las interfaces para comenzar. – LBushkin

+0

La versión 'dinámica' no necesita ser genérica. – Trillian

5

uso object, o un genérico Iface<TValue1,TValue2>

1

que en lugar derrota el objetivo de una interfaz y violaría la tipificación estricta de C#, ni siquiera una dinámica ayudaría usted allá afuera temo. La respuesta es no, yo creo.

1

realidad no, pero que podría ser:

interface Iface<TType1, TType2> 
{ 
    TType1 Prop1 { get; } 
    TType2 Prop2 { get; } 
} 

Sin embargo, a continuación, Iface<string, int> y IFace<int, bool?> habría tipos distintos. (es decir, su Class1 & Class2 no tendría una interfaz común)

3

Debería utilizar object o proporcionar una interfaz genérica.

La versión genérica se vería así:

interface IFace<T1, T2> 
{ 
    T1 Prop1 { get; } 
    T2 Prop1 { get; } 
} 

Esto permitirá que el tipo de implementación de dar esas propiedades cualquier tipo que quiere, pero el inconveniente es que cada vez que se acepta la interfaz es necesario especificar esos dos tipos:

public void DoSomething(IFace<int, string> sadFace) 
... 

Esto suele ser problemático, muy limitante al menos, puede ser "resuelto" dando la interfaz de una interfaz de base donde ambas propiedades están disponibles con object tipos de retorno.

creo que la mejor solución, sin llegar a repensar su enfoque es definir una IFace interfaz:

interface IFace 
{ 
    object Prop1 { get; } 
    object Prop1 { get; } 
} 

Luego, en su clase de implementar la interfaz explícitamente así:

class MyClass: IFace 
{ 
    public string Prop1 { get; } 
    public int Prop2 { get; } 

    object IFace.Prop1 { get; } 
    object IFace.Prop1 { get; } 
} 

Este permitirá a los usuarios que saben que el objeto es del tipo MyClass referirse a Prop1 y Prop2 por sus tipos reales y todo lo que use IFace puede usar p roperties con un tipo de devolución de object.

Yo he usado algo que se parece al último fragmento de código, e incluso la versión anterior de "interfaz genérica con interfaz básica", pero ese era un escenario muy especializado y no sé si podría haberlo resuelto de otra manera.

1

No conozco su escenario de uso, pero puede hacer esto al implementar la interfaz explícitamente. Nota: su implementación actual no le deja ninguna forma de asignar valores a estas propiedades, por lo que probablemente desee agregar un acceso de conjunto privado o protegido a las propiedades de la clase.

interface Iface 
{ 
    object Prop1 { get; } 
    object Prop2 { get; } 
} 

class Class1 : Iface 
{ 
    public string Prop1 { get; } 
    public int Prop2 { get; } 

    object Iface.Prop1 
    { 
     get { return Prop1; } 
    } 

    object Iface.Prop2 
    { 
     get { return Prop2; } 
    }  
} 

class Class2 : Iface 
{ 
    public int Prop1 { get; } 
    public bool? Prop2 { get; } 

    object Iface.Prop1 
    { 
     get { return Prop1; } 
    } 

    object Iface.Prop2 
    { 
     get { return Prop2; } 
    } 
} 
1

use object. Si puede proporcionar un escenario donde se está utilizando, las personas pueden dar mejores respuestas.

Cuestiones relacionadas