如果是能簡單解決的問題,就不用想得太複雜了

2021-09-05 21:37:08 字數 1360 閱讀 8750

有個朋友在msn問我說,有沒有關於emit的資料,它想生成乙個類的動態**。他抱怨emit還是很麻煩,不過交談過後知道他是想要做什麼。他希望為乙個物件的某個屬性作延遲載入,這樣可以避免一些無謂的消耗。例如:

public class 

someclass

// some other members...

}

原本構造乙個someclass時可以這樣:

var someclass = new 

someclass();

someclass.someid = getsomeid();

process(someclass);

但是由於process方法中可能不需要用到someid屬性,於是在外部呼叫的getsomeid方法可能就形成了無謂的效能損耗。乙個常見的做法方式可能就是進行延遲載入了。那位朋友的意思是先把someid標為virtual:

public class 

someclass

// some other members...

}

然後使用emit來生成乙個動態型別,繼承someclass,override掉someid屬性,形成延遲載入。不過我提出,這個方法是不是太重了,因為動態**不是那麼孤立存在的,它往往需要考慮很多其他東西。例如快取動態型別,例如,對於相同型別乙個成員或多個成員的延遲載入,使生成乙個通用的動態型別,還是多個動態型別。例如……怎麼樣的api是最合適的?

所以,如果只是簡單的情況下,不如直接手動來實現這樣的延遲效果:

public class 

lazysomeclass : someclass

set}

public

lazy

lazysomeid

}

於是在使用的時候就可以:

var someclass = new 

lazysomeclass();

someclass.lazysomeid = new

lazy

(() => getsomeid());

process(someclass);

這樣其實就可以在一定程度上達到目的了。lazy類的原理在之前也有過提及(這裡需要些修改),這是一種簡單但有用的型別。其實在專案的許多情況下,我們這麼做也足夠了。不需要複雜的方法,不需要複雜的emit。不過如果您是為了鍛鍊能力,或者由於專案中此類需求特別多,想設計乙個通用的的類庫,這也不錯。

當然,上面的實現也有缺陷,因為它不是最理想、最完整、最通用的延遲載入**類(為什麼?)。如果您感興趣,也可以想象乙個完美的**類應該是什麼樣子的,甚至給出乙個通用的輔助類庫。

哦,對了,nhibernate的做法其實也不完美,有機會我會分析一下,並闡述我的看法的。

客戶問題,如果是你如何破解?

小王是名有3年工作經驗的專案經理,在一次開發實施類的專案啟動時,小王做了非常細緻的計畫,尤其是擔心客戶不配合專案工作產生拖延,制定了一套客戶方和專案組臨時的管理組織結構,並對每個角色都寫了詳細的工作責任說明。小王在專案的執行過程中,發現客戶並不是按照之前承諾的工作職責履行自己的工作,經常按照自我的理...

如果是要得到縱向的表結構,可以查詢系統表

如果是要得到縱向的表結構,可以查詢系統表 select 表名 case when a.colorder 1 then d.name else end,表說明 case when a.colorder 1 then isnull f.value,else end,字段序號 a.colorder,欄位名...

工作的本質是解決問題

不知道你是否會經常產生 感覺在公司技術上得不到提公升,想跳槽的想法,但是你會發現乙個有趣的規律,換了一家新公司,三五個月之後,你又會有同樣的想法,它會進入到乙個死迴圈中。任何一件事情,做過兩三遍之後,都可以用貼上複製來解決。對於一家公司來說,公司的業務是比較固定,它並不是為你量身定做的。當你的成長速...