2009-10-20 71 views
4

我確實需要一個加載對象列表的解決方案 - 查找其中只有一個屬性從當前對象中引用,如本例中所示。具有未指定類型的通用方法可能嗎?

class LookupObjectAddress 
{ 
[...] 
public string City 
{ get; set; } 
[...] 
} 

class WorkingObject 
{ 
// references the property from LookupObjectAddress 
public string City 
{ get; set; } 
} 

對於查找我需要一個表從數據庫中加載,要加載我使用屬性

class WorkingObject 
{ 
// references the property from LookupObjectAddress 
[Lookup(Type=typeof(LookupObjectAddress), staticloaderclass="LookupObjLoader", staticloaderMethod="LookupObjLoadMethod")] 
public string City 
{ get; set; } 
} 

讀出的PropertyInfo對WorkingObject.City後的信息就知道屬性我知道查找對象的類型,以及從哪個類加載它的方法。 現在我需要橋接器來獲取帶有三個參數的列表。

Type loaderClass = Type.GetType(classname); 
MethodInfo loaderMethod = loaderClass.GetMethod(loadmethod); 
object objList = loaderMethod.Invoke(null, new object[] {}); 

因爲我需要的類型化列表<>使用UI上的LookupObjects的性質,我怎麼能成爲在代碼中可用列表?

我理想中的結果將是,如果我可以鍵入:

var list = Loader.Load(type, "LookupObjLoader", "LookupObjLoadMethod"); 

其中的參數是從屬性讀取。 (即在編譯時不知道)

+1

我真的不明白你的問題。你是說loaderMethod.Invoke()應該返回一個List 而不是? – GenericTypeTea 2009-10-20 09:03:49

+0

你可以寫一些代碼,這是你的理想結果嗎? – GenericTypeTea 2009-10-20 09:07:01

+0

這是對的,爲了與列表正常工作,我需要知道硬編碼列表的類型。但是我希望用戶控件能夠儘可能通用,而不是每個ObjectType的Case都具有查找功能。 – 2009-10-20 09:12:19

回答

5

爲了產生一個List<T>類型,從而例如,在運行時,其中T是來自一個Type對象,你可以這樣做:

Type genericListType = typeof(List<>); // yes, this really is legal syntax 
Type elementType = ... 
Type specificListType = genericListType.MakeGenericType(elementType); 
// specificListType now corresponds to List<T> where T is the same type 
// as elementType 
IList list = (IList)Activator.CreateInstance(specificListType); 

這將在運行時生成正確的列表類型並將其存儲在list變量中。

注意,有沒有辦法可以讓編譯器來推斷變量的類型,所以這樣的:

var list = Loader.Load(...) 

仍然不會產生List<T>,它將不得不使用非通用,在編譯時已知類型來存儲列表,如IList,但您存儲在其中的對象可以是通用的,按照上面描述的方式生成。

+0

這應該做。感謝它。 – 2009-10-20 09:58:52

相關問題