2012-11-06 7 views
5

C'è un modo per creare un'interfaccia con un attributo che deve essere utilizzato dalla classe che implementa l'interfaccia?Interfaccia che richiede l'implementazione dell'attributo

I.e. se la classe Foo implementa l'interfaccia IFoo e IFoo è definito come deve avere ObserveMeAttribute, allora Foo deve avere ObserveMe definito su di esso per implementare IFoo.

Edit:

Abilità è chiamato EntityTypeAttribute e viene utilizzato per specificare il tipo di entità del modello di vista, con l'utilizzo:

[EntityType(typeof(User))] 
public class UserViewModel 
{ 
... 
} 

Abilità viene utilizzato in un metodo di estensione AddModel (T tModel) dove attributo viene letto da TModel e il suo tipo di proprietà entityType viene utilizzato per creare un oggetto stub entità.

+0

Certo, non ho fatto molto con interfacce dai tempi del college, ma ho pensato che se una classe implementata un'interfaccia, ha dovuto implementare tutto in quella interfaccia? Questo è ciò che raccolgo da [Interfaces (C# Programming Guide)] (http://msdn.microsoft.com/en-us/library/vstudio/ms173156.aspx) – MyCodeSucks

risposta

3

La risposta semplice è "no". Se ogni oggetto deve avere ha questo valore per implementare IFoo perché non lo si rende parte dell'interfaccia IFoo?

Gli attributi sono principalmente un meccanismo per la ricerca di ulteriori informazioni dichiarative su una classe/metodo/parametro su tempo di esecuzione utilizzando la riflessione.

+0

Vengono anche introdotte per astrarre la logica ripetitiva lontano dalle classi che è quello che sto cercando di fare. Non mi piace anche introdurre proprietà aggiuntive alle mie classi di modelli che non fanno parte della definizione dell'oggetto. –

+0

Probabilmente sei bloccato a dover verificare la presenza di questo attributo in fase di esecuzione (o in una fase di creazione personalizzata). La logica ripetitiva per gestire qualcosa con un'interfaccia Ixxx potrebbe essere inserita in un metodo di estensione. Un esempio del tuo attributo e utilizzo potrebbe aiutare. –

+0

Ho aggiunto la descrizione dell'attributo. Fondamentalmente voglio assicurarmi che il mio modello di vista generico debba essere decorato con EntityTypeAttribute piuttosto che creare una gestione degli errori. –

0

Non puoi farlo. Ma è possibile risolvere il problema facendo la classe ViewModel generica con un argomento generico di classe Modello:

public abstract class Model 
{ 
... 
} 

public abstract class ViewModel<TModel> where TModel : Model 
{ 
... 
} 

e implementare la logica ripetitiva in questo classi astratte per ogni modello e ViewModel. Allora si avrà:

public class User : Model 
{ 
... 
} 

public class UserViewModel : ViewModel<User> 
{ 
... 
}