2012-07-27 43 views
1

我想設計一個足夠靈活的類來繪製有關不同種類數據的數據。我是C#中的OOP的新手,所以我在嘗試使用泛型,代表和類的組合來實現這一目標。指定一個通用屬性的方法

下面是我到目前爲止已經寫的類:

using System; 
using System.Collections.Generic; 

namespace Charting 
{ 
    public class DataChart<T> 
    { 
     public Func<T, object> RowLabel { get; set; } 
    } 
} 

而這裏的如何,我想叫它:

var model = new DataChart<MyClass>() 
{ 
    RowLabel = delegate(MyClass row) 
    { 
     return String.Format("{0}-hello-{1}", row.SomeColumn, row.AnotherColumn); 
    } 
}; 

這種方法的問題是,我想必須明確地投射由RowLabel發射的物體。我希望我能以某種方式使輸出類型成爲通用的,併爲其添加約束條件,如下所示:

public class DataChart<T> 
    { 
     // The output of the RowLabel method can only be a value type (e.g. int, decimal, float) or string. 
     public Func<T, U> RowLabel where U : struct, string { get; set; } 
    } 

這可能嗎?如果是這樣,我該怎麼做?提前致謝!

+0

'RowLabel'的設計看起來有點奇怪。我只是想知道在你的程序中如何調用RowLabel,因爲它們有不同的返回值類型?也許有可能改進設計? – 2012-07-27 20:32:11

+0

是的,我非常確定有空間來改善事情......我甚至沒有完成任何東西。我只是想知道我提出的一些想法是否可能。 – 2012-07-27 21:09:26

+0

如果RowLabel是爲行提供標籤的函數,它應該返回字符串不應該嗎? – 2012-07-27 23:21:49

回答

1

你可以做的這一些

首先,一般化輸出:只需添加另一種類型參數的類。

public class DataChart<T, U> 
{ 
    public Func<T, U> RowLabel { get; set; } 
} 

但是你提到的那些類型約束沒有意義。類型約束是「和」的,而不是「或」。 A string不是struct,因此您不能將其限制爲該類型的特定組合。如果你不受約束,它仍然可以工作,儘管你失去了一些編譯時的安全性。

編輯:此外,事實證明,你不能指定string作爲一個類型參數,反正。這是一個密封的班級!具有隻接受密封類的類型的泛型是毫無意義的,編譯器會阻止它。

+0

我不想在課堂上指定U,所以這種方法無效。但知道類型約束是AND-ed是有幫助和有意義的。 最糟糕的情況是,我只是將** RowLabel **屬性聲明爲'Func '並稱它爲一天 - 畢竟,很容易將值類型表示爲字符串。另外,我懷疑我在尋找的是對通用屬性的支持,我相當確定它不在.NET 4中。 – 2012-07-27 20:32:31

+0

通用屬性絕對不受支持。 – 2012-07-27 21:18:53

相關問題