3 回答

TA貢獻1773條經(jīng)驗 獲得超3個贊
當(dāng)泛型的參數(shù)類型是動態(tài)的...
Posted on 2007-04-26 17:58 zhuweisky 閱讀(3428) 評論(17) 編輯 收藏 所屬分類: C#專欄
在使用泛型技術(shù)時,我們經(jīng)常使用靜態(tài)泛型參數(shù),即泛型的參數(shù)類型在編譯時就已經(jīng)確定,比如:
IList<int> list = new List<int>(); 集合IList的泛型參數(shù)是int類型,這在編譯期就可以知道,于是,我們可以這樣調(diào)用IList<>的Add方法:
list.Add(6) ;
如果泛型的參數(shù)類型是動態(tài)的了,也就是說,只有當(dāng)程序運行起來后,才知道泛型參數(shù)的具體類型,其可能是int,也可能是string或其它。那該如何?使用反射,大家都知道這個答案,是的,使用反射可以解決問題,但是,反射就會有兩個與身俱來的缺陷:一是喪失了強類型的好處,二是效率不高。
還有一種更優(yōu)雅的解決方案,那就是使用動態(tài)代理。針對上述的例子,我們首先定義一個非泛型的接口:
/// <summary>
/// ISimpleList 用于創(chuàng)建動態(tài)代理,將運行時的IList<>接口轉(zhuǎn)換為靜態(tài)的ISimpleList接口
/// </summary>
public interface ISimpleList
{
void Add(object element);
} 然后,調(diào)用ESBasic.Emit.DynamicTypeEmitter類的static CreateDynamicProxy方法,創(chuàng)建動態(tài)代理實例,該動態(tài)代理實現(xiàn)了ISimpleList接口,接著便可以調(diào)用ISimpleList的Add方法來添加元素到集合中。 public static void CallAddDemo(Type listElementType ,object addedElement)
{
Type closedGenericListType = typeof(List<>).MakeGenericType(listElementType);
object list = Activator.CreateInstance(closedGenericListType);
ISimpleList simpleList = (ISimpleList)DynamicTypeEmitter.CreateDynamicProxy<ISimpleList>(list);
simpleList.Add(addedElement);
} 動態(tài)代理解決方案的效率因素:
(1)同一個動態(tài)代理類型只會生成一次,ESBasic會緩存生成的代理類型,以后便不會重復(fù)生成。
(2)動態(tài)代理的方法的調(diào)用將直接轉(zhuǎn)發(fā)(如 前面的ISimpleList.Add方法會直接轉(zhuǎn)發(fā)給IList<>.Add),不會有反射的效率損失。
(3)如果是值類型元素,那么可能會有box和unbox的性能損失;對于引用類型,則不存在

TA貢獻1793條經(jīng)驗 獲得超6個贊
這個也算泛型?
至少也該這樣吧
public class GenericityUserInfo〈T〉
{
public T TP
{
get; set;
}
}

TA貢獻1884條經(jīng)驗 獲得超4個贊
你的需求其實是泛型約束。
我給出的方案如下:
(1)首先定義一個基類GenericityUserInfo,也可以是接口,抽象類也可以,只要有兩個 虛屬性 PassWord和UserName
(2)然后你的方法這樣定義:
private string CreateRegist<T>(T t)where T:GenericityUserInfo
{
//在這里,可以保證t有屬性 PassWord和UserName
}
添加回答
舉報