台灣最大程式設計社群網站
線上人數
485
 
會員總數:245782
討論主題:189419
歡迎您免費加入會員
討論區列表 >> C# >> 泛型傳入值的問題
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
泛型傳入值的問題
價值 : 120 QP  點閱數:551 回應數:5
樓主

aaa
門外漢
0 1
14 2
發送站內信

各位前輩大家好:

小弟需要寫一個方法,可以傳入不同類別的object後,異動其值。在已明確知道會傳入的類別物件,以及傳入的類別都是實作同一個interface出來的,
且各類別所需異動到的成員及值也都一樣,故方法撰寫如下:

public interface IItemModel{
string property1 {get;}
string property2 {get;}
}

class ClassA :IItemModel{
string property3 {set; get;}
string property4 {set; get;}
}

class ClassB :IItemModel{
string property3 {set; get;}
string property4 {set; get;}

}
class ClassC :IItemModel{
string property3 {set; get;}
string property4 {set; get;}
}

public static void UpdateMethod<T>(T objectItem) where T : IItemModel{
if (objectItem.GetType().Equals(typeof(ClassA))){
ClassA item = objectItem as ClassA
item.property3 = "123";
item.property4 = "456";
update<ClassA>(item);
} else if(objectItem.GetType().Equals(typeof(ClassB))){
ClassB item = objectItem as ClassB
item.property3 = "123";
item.property4 = "456";
update<ClassB>(item);
} else if(objectItem.GetType().Equals(typeof(ClassC))){
ClassC item = objectItem as ClassC
item.property3 = "123";
item.property4 = "456";
update<ClassC>(item);
}

請問高手們有無更好方法可以省略if判斷式中重複做的動作,達到更好維護的效果
謝謝大家,感恩不盡


搜尋相關Tags的文章: [ 泛型 ] , [ ] ,
本篇文章發表於2018-09-03 14:42
1樓
回應

春天
檢舉此回應
基本上你的問題跟泛型沒關係,而且這種需求可以不使用泛型,以下

要解決問題要先知道為什麼要賦值的資料來源是什麼,為什麼要這樣分類賦值
本篇文章回覆於2018-09-03 15:22
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
不錯的參考

春天
檢舉此回應
補充一下內容好了,單單看你的方法,可以簡化成

這樣才是interface原本的用意
本篇文章回覆於2018-09-03 15:26
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

aaa
檢舉此回應
春天您好:


賦值的資料來源都是用property1 去另外的方法取得
使用泛型的原因是因為,
希望賦值及異動那段可以不要重複寫
可以用update<T>(item); 來異動item
,但是因為需要賦值的成員property3 及property4 是IItemModel 裡沒有宣告的
所以如果沒有分別將objectItem轉型成 classA, classB 及 classC 的物件

objectItem.property3
objectItem.property4 是無法賦值的
目前大概是卡在這部分。

感謝您的回覆





本篇文章回覆於2018-09-03 15:36
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
最有價值解答

春天
檢舉此回應
那你試試dynamic

如果你不想用dynamic也可以自己寫Reflection
本篇文章回覆於2018-09-03 15:45
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

aaa
檢舉此回應
春天大 感謝您
我用Reflection 試出來了
本篇文章回覆於2018-09-03 17:24
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.