2013-07-24 71 views
6

考慮下面的代碼:使用動態類型,而不是沒有,可能一般屬性

public dynamic DataGrid { get; private set; } 
    public DataGridForm<TData, TGrid> GridConfig<TData, TGrid>() where TData : class 
    { 
     return DataGrid = new DataGridForm<TData, TGrid>(); 
    } 

我試圖保持一個泛型類的實例在property供以後使用,但如你所知:

屬性,事件,構造函數等不能通用 - 只有方法 和類型可以是通用的。大多數的,這不是一個問題的時間,但我 同意,有時這是一個痛苦(Jon Skeet

我想知道這是這一輪情況好辦法?

+0

你能不能把常用功能在接口'IDataGridForm'然後有屬性是此類型的? – Corak

+0

我無法得到你,你能解釋更多細節嗎? – saber

+2

那麼,你想如何使用DataGridForm呢?例如,我想你想要「顯示」一個表格。因此,使用Display()方法創建一個接口'IDataGridForm'。現在讓你的類'DataGridForm '實現該接口。它需要有'Display()'方法來做到這一點。現在有一個屬性'公共IDataGridForm DataGrid {get;私人設置; }'。這個屬性現在可以包含一個'DataGridForm ',你可以在任何你想要的地方顯示()。 – Corak

回答

1

正如評論答案表明,你可以用一個基類或接口做到這一點:

class DataGridForm {} 
class DataGridForm<TData, TGrid> : DataGridForm {} 

class GridConfigurator 
{ 
    public DataGridForm DataGrid { get; private set; } 
    public DataGridForm<TData, TGrid> GridConfig<TData, TGrid>() where TData : class 
    { 
     return DataGrid = new DataGridForm<TData, TGrid>(); 
    } 
} 

在C#一噸的類和接口被擴展爲添加泛型這種方式。不過,我可能會重新評估你的設計,以便可能是所謂的GridConfig()都會緩存DataGridForm,因爲它知道類型。舉個例子,我在我的代碼非常類似的事:

class Vector<T> { ... } 
static class Vector 
{ 
    public static Vector<T> Create<T>(T value) 
    { 
     return new Vector<T>(value); 
    } 
} 

class OtherClass 
{ 
    public static Vector<int> MyVector = Vector.Create(1); 
} 

您的具體使用情況,雖然不支持這種風格。

+0

我意識到你所解釋的不符合我的要求,如果我有在'DataGridForm'中有一個返回'DataGridForm '的方法。在這種情況下,我必須使基類型成爲泛型類型。我對嗎? – saber

+0

如果它是一種方法,但不是,如果它是屬性。在我的第二個例子中,Vector 可以從Vector繼承而沒有問題。 – lukegravitt

+0

Vector.Create的返回類型不應該是Vector ? – marcob

0

在這種情況下,你的類型本身是通用的。

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>(); 
     } 
    } 

但我不明白這門課的目的。 GridConfig方法具有設置DataGrid屬性(具有私有設置器)的非明顯副作用。如果我使用這個類,我永遠不會猜測GridConfig()返回給我的值也被設置爲DataGrid屬性。換句話說:

var configurator = new GridConfigurator(); 
var firstGrid = configurator.GridConfig(); 
var firstReference = configurator.DataGrid; 
var secondGrid = configurator.GridConfig(); 
var secondReference = configurator.DataGrid; 

我將承擔以下將返回false:

object.ReferenceEquals(firstGrid, secondGrid); 

不過,我會以爲這將返回:因爲在任何時候

object.ReferenceEquals(firstReference, secondReference); 

上面的代碼是否曾經分配過DataGrid屬性。目前尚不清楚名爲GridConfig()的方法會產生這種效果。

使封閉類型(GridConfigurator)也似乎通用打敗你想要什麼樣的目的。爲什麼會有人使用這種類型,他們可以直接使用DataGridForm的直接引用呢?

如果GridConfig方法是應該做的事情不僅僅是分配DataGridForm的一個新的默認實例,然後使它成爲一個靜態工廠類是這樣的:

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; 
    } 
} 

我還要名字比其他方法的東西GridConfig。像Configure()或Create()。

相關問題