C'è un modo per ottenere ciò che si vuole - nascondere i membri che non si vuole vedere - ma rendono applica automaticamente, senza la necessità di una cooperazione degli altri in termini di loro utilizzando un'interfaccia personalizzata. Puoi farlo reintroducendo tutti i membri che non vuoi vedere e taggandoli con gli attributi.
Questo è ciò che fa Windows Form quando, ad esempio, una proprietà di classe base non significa nulla per un determinato discendente. Ad esempio, Control ha una proprietà Text, ma una proprietà Text non ha senso su, ad esempio, un TabControl. Quindi TabControl sovrascrive la proprietà Text e aggiunge attributi al suo override dicendo "A proposito, non mostrare la mia proprietà Text nella Griglia Proprietà o in Intellisense." La proprietà esiste ancora, ma dal momento che non la vedi mai, non ti ostacola.
Se si aggiunge un [EditorBrowsable (EditorBrowsableState.Never)] attributo a un membro (proprietà o un metodo), quindi Intellisense non sarà più dimostrare che membro nelle sue liste completamento del codice. Se sto capendo correttamente la tua domanda, questa è la grande cosa che stai cercando di ottenere: rendere difficile per il codice dell'applicazione utilizzare il membro per sbaglio.
Per le proprietà, probabilmente anche da aggiungere [sfogliabile (false)] per nascondere la proprietà dalla griglia delle proprietà, e [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] per evitare che il progettista di scrivere il valore della proprietà al file .designer.cs.
Ciò renderà molto difficile l'utilizzo accidentale del metodo/proprietà. Non sono ancora una garanzia, però. Se hai bisogno di una garanzia, inserisci anche un attributo [Obsoleto] e costruisci con "Considera gli avvertimenti come errori" - quindi ti prendi cura di te.
Se il membro di base è virtuale, è probabile che si desideri sovrascriverlo e fare in modo che l'override faccia semplicemente call base. Non lanciare un'eccezione, poiché il membro sottoposto a override verrà probabilmente chiamato dalla classe base durante il normale corso degli eventi. D'altra parte, se il membro base non è virtuale, allora si vuole usare "nuovo" invece di "sovrascrivere", e si può decidere se l'implementazione deve chiamare base, o semplicemente lanciare un'eccezione - nessuno dovrebbe usare il tuo membro reintrodotto comunque, quindi non dovrebbe importare.
public class Widget : UserControl
{
// The Text property is virtual in the base Control class.
// Override and call base.
[EditorBrowsable(EditorBrowsableState.Never)]
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Obsolete("The Text property does not apply to the Widget class.")]
public override string Text
{
get { return base.Text; }
set { base.Text = value; }
}
// The CanFocus property is non-virtual in the base Control class.
// Reintroduce with new, and throw if anyone dares to call it.
[EditorBrowsable(EditorBrowsableState.Never)]
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Obsolete("The CanFocus property does not apply to the Widget class.")]
public new bool CanFocus
{
get { throw new NotSupportedException(); }
}
// The Hide method is non-virtual in the base Control class.
// Note that Browsable and DesignerSerializationVisibility are
// not needed for methods, only properties.
[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete("The Hide method does not apply to the Widget class.")]
public new void Hide()
{
throw new NotSupportedException();
}
}
Sì, questo è un bel po 'di lavoro, ma basta farlo una volta ... per ogni membro, per classe ... umm, sì. Ma se quei membri della classe base non si applicano davvero alla tua classe, e averli lì causerà confusione, allora potrebbe valere la pena di andare allo sforzo.
Potrebbe per favore darci un esempio del risultato atteso? Come sarà il tuo codice una volta trovata una soluzione? – DonkeyMaster
Il risultato sarà che UserControl personalizzato è visibile nel modulo e nel codice è presente un membro di tipo ICustomerName, ma nel codice non è * un * un membro del tipo SomeCustomerNameUserControl. Se questo non è abbastanza chiaro, fammi sapere dove elaborare. –
Ok, dopo aver letto la tua spiegazione e il resto delle risposte, capisco la tua domanda. Ehi, è come Jeopardy! – DonkeyMaster