2010-04-06 19 views
25

Duplicar posibles:
Making a generic propertyGenérico propiedad en C#

No estoy muy seguro de cómo hacerlo, pero lo que me gustaría hacer es crear un tipo especial de propiedad que realizará tareas específicas en get y set, y se definirá en tipo genérico. Por ejemplo, al escribir esto:

MyProp<String> name; 

un pre-definidos y getset se llevará a cabo en el valor de cadena.

¿Cómo se puede hacer eso?

Gracias!

+3

No estoy seguro de que entiendo la pregunta. – Amy

+1

¿por qué necesita genéricos para esto? ¿Puedes publicar un ejemplo de lo que realmente quieres hacer y por qué quieres hacerlo en varios tipos? – Dave

+0

Yo tampoco entiendo. Podría 'MyProp name {get {return DoCustomGet(); } {set {DoCustomSet (value); }} 'no funciona? – Jaxidian

Respuesta

61

Se puede hacer una clase genérica de esta manera:

public class MyProp<T> 
{ 
    private T _value; 

    public T Value 
    { 
     get 
     { 
      // insert desired logic here 
      return _value; 
     } 
     set 
     { 
      // insert desired logic here 
      _value = value; 
     } 
    } 

    public static implicit operator T(MyProp<T> value) 
    { 
     return value.Value; 
    } 

    public static implicit operator MyProp<T>(T value) 
    { 
     return new MyProp<T> { Value = value }; 
    } 
} 

...luego utilizarlo en una clase de este modo:

class SomeClass 
{ 
    public MyProp<int> SomeProperty { get; set; } 
} 

Los operadores implícitos significa que no es necesario establecer explícitamente o conseguir la propiedad Value de MyProp, pero puede escribir código para acceder al valor de una forma más "natural" manera:

SomeClass instance = new SomeClass(); 
instance.SomeProperty = 32; 
int someInt = instance.SomeProperty; 
+0

Creo que falta tomar "..para crear un tipo especial de propiedad que realice tareas específicas en el get y set .." en la cuenta, pero dado que esta pregunta no está clara, podría estar equivocado. –

+0

@Benjamin: sí, la pregunta es un poco confusa, pero ahí es donde los comentarios de 'insertar la lógica deseada aquí' entran en escena en mi muestra de código. Podría poner en alguna lógica que se realizará cada vez que se invoca el captador o instalador, independientemente de la propiedad para la que esté hecho. –

+0

Whoa, me perdí completamente de ver la imagen completa. Realmente no soy amigo de operadores implícitos, pero creo que respondiste la pregunta muy bien. +1. –

2

Debería crear una clase genérica llamada MyProp. Luego, deberá agregar operadores de conversión implícitos o explícitos para que pueda obtener y establecer el valor como si fuera el tipo especificado en el parámetro de tipo genérico. Estos operadores de reparto pueden hacer el trabajo extra que necesita.

+0

no funcionaría Creo que solo con los operadores de elenco, uno también necesitaría el operador de asignación que no se puede cargar ... –

+0

@Tim: los operadores de elenco van en ambas direcciones. Al asignar una cadena a un MyProp , si hay un operador de conversión implícito, se usaría. –

+0

sí, pero un desarrollador todavía podría establecer la propiedad con un valor MyProp sin tener que ser interceptado .... –

1

Usted acaba de declarar la propiedad de la manera habitual utilizando un tipo genérico:

public MyType<string> PropertyName { get; set; } 

Si desea llamar a los métodos predefinidos para hacer algo en el obtener o establecer, implementar la propiedad de captador/definidor a llamar a esos métodos .

+0

También puede declarar propiedades con tipos genéricos no vinculados, lo que hace las cosas más divertidas: public MyType PropertyName {get; conjunto; }. Si implementa getter/setter, el tipo de valor será T y variará con la forma en que se usa. – dthorpe

3

No se puede 'alterar' la sintaxis de la propiedad de esta manera. Lo que puede hacer es la siguiente:

class Foo 
{ 
    string MyProperty { get; set; } // auto-property with inaccessible backing field 
} 

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

class Foo<T> 
{ 
    T MyProperty { get; set; } 
} 
2

Está bien, voy a morder. Desea algo como esto: Si declara una "propiedad" como esta:

Actualización: Ahora estoy bastante seguro de que Fredrik Mörk respondió su pregunta y le dio una solución. No estoy muy contento con la idea, pero parece responder exactamente lo que entendí de su pregunta.

public class PropertyFoo { 
    public MyProp<String> Name; 
} 

esto termina como

public class PropertyFoo { 
    public string Name { 
    get { /* do predefined stuff here */ } 
    set { /*other predefined stuff here */ } 
    } 
} 

No es posible No. y no una propiedad, de verdad. Busque soporte de plantilla/fragmento en su IDE.

+0

+1 la conclusión más lógica. – leppie

1
public class MyProp<T> 
{ 
... 
} 

public class ClassThatUsesMyProp 
{ 
public MyProp<String> SomeProperty { get; set; } 
}