In diesem Fall muss Ihr Typ selbst generisch sein.
class GridConfigurator<TData, TGrid>
where TData : class
{
public DataGridForm<TData, TGrid> DataGrid { get; private set; }
public DataGridForm<TData, TGrid> GridConfig<TData, TGrid>()
{
return DataGrid = new DataGridForm<TData, TGrid>();
}
}
Aber ich verstehe nicht den Zweck dieser Klasse. Die GridConfig-Methode hat einen nicht offensichtlichen Nebeneffekt beim Festlegen der DataGrid-Eigenschaft (die über einen privaten Setter verfügt). Wenn ich diese Klasse verwenden würde, würde ich niemals vermuten, dass der Wert, den GridConfig() mir zurückgibt, auch als DataGrid-Eigenschaft festgelegt ist. Mit anderen Worten:
var configurator = new GridConfigurator();
var firstGrid = configurator.GridConfig();
var firstReference = configurator.DataGrid;
var secondGrid = configurator.GridConfig();
var secondReference = configurator.DataGrid;
würde ich folgendes würde return false annehmen:
object.ReferenceEquals(firstGrid, secondGrid);
Aber ich würde davon ausgehen, das wahr zurückkehren würde:
object.ReferenceEquals(firstReference, secondReference);
Da zu keinem Zeitpunkt in den obigen Code zuweisen ich jemals die DataGrid-Eigenschaft. Es ist nicht klar, dass eine Methode namens GridConfig() diesen Effekt haben würde.
Den einschließenden Typ (GridConfigurator) auch generisch zu machen scheint den Zweck dessen, was Sie versuchen, zu besiegen. Warum sollte jemand diesen Typ verwenden, wenn er stattdessen nur einen direkten Verweis auf DataGridForm verwenden könnte?
Wenn die GridConfig Methode soll etwas mehr tun, als nur eine neue Standardinstanz von DataGridForm zuweisen, dann machen es eine statische Factory-Klasse wie folgt aus:
static class GridConfigurator
{
public static DataGridForm<TData,TGrid> GridConfig<TData, TGrid>(...) where TData: class
{
var grid = new DataGridForm<TData,TGrid>();
// do something with the parameters to this method to initialize the instance.
return grid;
}
}
ich auch das Verfahren etwas anderes nennen würde als GridConfig. Wie Configure() oder Create().
Können Sie nicht die allgemeine Funktionalität in eine Schnittstelle 'IDataGridForm' setzen und dann die Eigenschaft dieses Typs haben? – Corak
Ich kann dich nicht bekommen, kannst du das genauer erklären? – saber
Nun, wie willst du das 'DataGridForm' benutzen? Zum Beispiel stelle ich mir vor, dass Sie ein Formular anzeigen möchten. Machen Sie eine Schnittstelle 'IDataGridForm' mit einer Methode' Display() '. Lassen Sie nun Ihre Klasse 'DataGridForm diese Schnittstelle implementieren. Es muss diese 'Display()' Methode haben, um das zu tun. Habe jetzt eine Eigenschaft 'public IDataGridForm DataGrid {get; privates Set; } '. Diese Eigenschaft kann jetzt ein 'DataGridForm ' enthalten und Sie können 'Display()' dort anzeigen, wo Sie möchten. –
Corak