我有一個通用的類。 Class<T>
並根據在調用代碼switch語句也可以是class<int>
class<string>
class<decimal>
C#通用T類TypeOf,這可能嗎?
的返回,因爲調用代碼不知道它是什麼,直到它被設置在此之後返回它作爲一個對象的方法。
有沒有辦法做到這一點,當我從該函數返回對象?
load(object result)
{
Type t = result.GetType().GetGenericArguments()[0];
Class<t> x = (Class<t>) result;
}
或者我必須設置一個檢查來檢查它可能的每種類型。如果int
然後Class<int>
,等...
編輯:
這裏就是我試圖做的,實際代碼:
public class ReportResult<TP>
{
public ReportResult()
{
ReportHeaders = new List<ReportHeader>();
ReportViews = new List<IDataAttributeChild<TP>>();
}
public List<ReportHeader> ReportHeaders {get;set;}
public List<IDataAttributeChild<TP>> ReportViews {get;set;}
}
BAL
public object GetReportData(ReportProcedureNameEventArg procedureNameEventArg)
{
object result = null;
switch (procedureNameEventArg.SelectedNode.Class)
{
case ReportClass.Count:
var r = new ReportResult<int>
{
ReportViews = GetCountByReport(procedureNameEventArg),
ReportHeaders = GetReportHeaders(procedureNameEventArg.SelectedNode.ReportViewId)
};
result = r;
break;
case ReportClass.List:
break;
case ReportClass.Date:
var r = new ReportResult<datetime>
{
ReportViews = GetDateSummaryReport(procedureNameEventArg),
ReportHeaders = GetReportHeaders(procedureNameEventArg.SelectedNode.ReportViewId)
};
result = r;
break;
default:
throw new ArgumentOutOfRangeException();
}
return result;
}
的GUI
public void LoadTreeResult(object result)
{
Type t = result.GetType().GetGenericArguments()[0];
ReportResult<?> fff = (ReportResult<?>)result;
dgResult.Columns.Clear();
foreach (var header in result.ReportHeaders)
{
dgResult.Columns.Add(
new DataGridTextColumn
{
Header = header.Header,
Binding = new Binding(header.Binding)
});
}
// This would also be a switch depending on a property coming
// back to now what class to cast to in order to populate the grid.
List<ReportCountByView> d = new List<ReportCountByView>();
foreach (var reportCountByView in result.ReportViews)
{
d.Add((ReportCountByView)reportCountByView);
}
dgResult.ItemsSource = d;
}
這是一個類模型的佈局,以防它可能有所幫助。
感謝。
有時候,當我發現自己處於這個位置時,答案就是使該函數成爲一個通用本身(從而使'object result'具有強類型,然後可以執行Class等等)。也許如果你發佈了更多的代碼,我們可以看到這是否適用?否則,我認爲你的選擇可能會做一個很大的「if」塊,或者可能是一些動態的瘋狂。 –
Brook
2011-04-16 01:56:02
只需發佈代碼和圖表。 – nitefrog 2011-04-16 02:10:42
這看起來過於複雜,甚至不清楚你想要完成什麼。你只是試圖用給定類型的值填充樹? – Jason 2011-04-16 07:11:14