c 泛型和反射的設計應用

2021-12-29 20:36:29 字數 1272 閱讀 2422

from 心靈魔術師s blog

在裝置操作面板的設計中總會有一類固定的按鈕和操作慣例,但如果每做乙個專案都寫一套同樣的**實在很沒效率的事。

裝置的操作按鈕大多數都會包含啟動、暫停、停止這三個按鈕,軟體介面中也同樣需要這三類按鈕,軟體需要根據裝置的狀態

來禁用或啟用不同的按鈕組合。比如剛啟動軟體時,啟動按鈕開啟,暫停和停止按鈕禁用等等。

一般設計情況下是用button,也有的設計會用toolstripbutton,為了使其相容更多的控制項,所以採用了泛型。**如下:

public enum operatestate ;

public class operatestaterule where t : toolstripitem

//set

}public operatestaterule(t _start, t _pause, t _stop)

public void update(operatestate _state)

}catch (exception ex)}}

呼叫示例:

toolstripbutton btnstart;

toolstripbutton btnpause;

toolstripbutton btnstop;

//生成物件時繫結相應的按鈕

operatestaterule rule = new  operatestaterule(btnstart,btnpause,btnstop);

//在click事件裡更新狀態

private void btnstart_click(object sender, eventargs e)

private void btnpause_click(object sender, eventargs e)

private void btnstop_click(object sender, eventargs e)

在類宣告上有個where t : toolstripitem語句,這個是c#型別約束,如果不加這個約束,編譯器會報錯找不到enabled屬性,

但有個問題button和toolstripbutton這兩個類不是同乙個基類派生,所以無法相容使用這2個類,因為必須要有這個約束,使得c++

的一些泛型做法受到限制。

那還有沒有更好的方法來達到理想的效果呢,答案是有的,就是反射。看下面改進的**例子:

public enum operatestate ;

public class operatestaterule

//set {

C 反射泛型

c 泛型反射和普通反射的區別,泛型反射和普通反射的區別就是泛型引數的處理上 先看乙個簡單的例子。class class1 要利用反射動態建立該型別例項,並呼叫 test 方法,我們可以使用如下方法 type type typeof class1 object o activator.createin...

C 反射泛型

摘自 c 泛型反射和普通反射的區別,泛型反射和普通反射的區別就是泛型引數的處理上 先看乙個簡單的例子。class class1 要利用反射動態建立該型別例項,並呼叫 test 方法,我們可以使用如下方法 type type typeof class1 object o activator.creat...

c 泛型 反射

程式的賬套模組,有乙個賬套間相互複製資料的功能,有幾個表需要實現這個功能。這些表有共有屬性 user id和count set id。為了節省 我用乙個介面規範了這幾個類,其中介面包含上面兩個屬性。資料的操作是在linq to sql的基礎上實現的。所以操作大物件是dataclasses1datac...