C 動態新增屬性

2021-06-01 22:47:43 字數 4304 閱讀 9861

原文:

using system;

using system.collections.generic;

using system.reflection.emit;

using system.reflection;

using system.threading;

//李劍

namespace copymapfile

/** /// 根據類的型別型建立類例項。

///

/// 將要建立的型別。

/// 返回建立的類例項。

public static object createinstance(type t)

/** /// 根據類的名稱,屬性列表建立型例項。

///

/// 將要建立的類的名稱。

/// 將要建立的類的屬性列表。

/// 返回建立的類例項

public static object createinstance(string classname, listlcpi)

/** /// 根據屬性列表建立類的例項,預設類名為defaultclass,由於生成的類不是強型別,所以類名可以忽略。

///

/// 將要建立的類的屬性列表

/// 返回建立的類的例項。

public static object createinstance(listlcpi)

/** /// 根據類的例項設定類的屬性。

///

/// 將要設定的類的例項。

/// 將要設定屬性名。

/// 將要設定屬性值。

public static void setpropertyvalue(object classinstance, string propertyname, object propertsetvalue));}

/** /// 根據類的例項獲取類的屬性。

///

/// 將要獲取的類的例項

/// 將要設定的屬性名。

/// 返回獲取的類的屬性。

public static object getpropertyvalue(object classinstance, string propertyname));}

/** /// 建立乙個沒有成員的型別的例項,類名為"defaultclass"。

///

/// 返回建立的型別的例項。

public static type buildtype()

/** /// 根據類名建立乙個沒有成員的型別的例項。

///

/// 將要建立的型別的例項的類名。

/// 返回建立的型別的例項。

public static type buildtype(string classname)

/** /// 新增屬性到型別的例項,注意:該操作會將其它成員清除掉,其功能有待完善。

///

/// 指定型別的例項。

/// 表示屬性的乙個列表。

/// 返回處理過的型別的例項。

public static type addproperty(type classtype, listlcpi)

/** /// 新增屬性到型別的例項,注意:該操作會將其它成員清除掉,其功能有待完善。

///

/// 指定型別的例項。

/// 表示乙個屬性。

/// 返回處理過的型別的例項。

public static type addproperty(type classtype, custpropertyinfo cpi)

/** /// 從型別的例項中移除屬性,注意:該操作會將其它成員清除掉,其功能有待完善。

///

/// 指定型別的例項。

/// 要移除的屬性。

/// 返回處理過的型別的例項。

public static type deleteproperty(type classtype, string propertyname)

/** /// 從型別的例項中移除屬性,注意:該操作會將其它成員清除掉,其功能有待完善。

///

/// 指定型別的例項。

/// 要移除的屬性列表。

/// 返回處理過的型別的例項。

public static type deleteproperty(type classtype, listls)

#endregion

#region 私有方法

/** /// 把型別的例項t和lcpi引數裡的屬性進行合併。

///

/// 例項t

/// 裡面包含屬性列表的資訊。

private static void mergeproperty(type t, listlcpi)

}/** /// 從型別的例項t的屬性移除屬性列表lcpi,返回的新屬性列表在lcpi中。

///

/// 型別的例項t。

/// 要移除的屬性列表。

private static listseparateproperty(type t, listls)}}

return ret;

}/** /// 把lcpi引數裡的屬性加入到mytypebuilder中。注意:該操作會將其它成員清除掉,其功能有待完善。

///

/// 型別構造器的例項。

/// 裡面包含屬性列表的資訊。

private static void addpropertytotypebuilder(typebuilder mytypebuilder, listlcpi)

catch (exception ex)

//定義set方法。

custnamesetpropmthdbldr =

mytypebuilder.definemethod(cpi.setpropertymethodname,

getsetattr,

null,

new type );

custnamesetil = custnamesetpropmthdbldr.getilgenerator();

custnamesetil.emit(opcodes.ldarg_0);

custnamesetil.emit(opcodes.ldarg_1);

custnamesetil.emit(opcodes.stfld, customernamebldr);

custnamesetil.emit(opcodes.ret);

"ceshi");

//把建立的兩個方法(get,set)加入到propertybuilder中。

custnamepropbldr.setgetmethod(custnamegetpropmthdbldr);

custnamepropbldr.setsetmethod(custnamesetpropmthdbldr);}}

/** /// 把屬性加入到型別的例項。

///

/// 型別的例項。

/// 要加入的屬性列表。

/// 返回處理過的型別的例項。

public static type addpropertytotype(type classtype, listlcpi)

#endregion

#region 輔助類

/** /// 自定義的屬性資訊型別。

///

public class custpropertyinfo

/** /// 根據屬性型別名稱,屬性名稱構造例項。

///

/// 屬性型別名稱。

/// 屬性名稱。

public custpropertyinfo(string type, string propertyname)

/** /// 獲取或設定屬性型別名稱。

///

public string type

set

}/** /// 獲取或設定屬性名稱。

///

public string propertyname

set

}/** /// 獲取屬性欄位名稱。

///

public string fieldname

}/** /// 獲取屬性在il中的set方法名。

///

public string setpropertymethodname

}/** /// 獲取屬性在il中的get方法名。

///

public string getpropertymethodname}}

#endregion

}}

動態新增class屬性

首先,我定義三個,單擊後為canvas新增相應的形狀。我是注釋,我是注釋,粘上去灰底黑字好醜好醜,嫌棄臉 以question為例,定義question為乙個菱形,這是 function dispquestionprompt 那麼問題來了,如果我想為動態新增的div再新增class屬性,怎麼辦呢?方法...

iOS runtime 動態新增屬性

qq群 807236138 群稱 ios 技術交流學習群 1.runtime 動態新增屬性 什麼時候需要動態新增屬性 2.開發場景 給系統的類新增屬性的時候,可以使用runtime動態新增屬性方法 3.本質 動態新增屬性,就是讓某個屬性與物件產生關聯。runtime一般都是針對系統的類 4.在分類中...

Python動態新增屬性

class student object classmethod修飾的屬性可以通過類變數和類例項變數直接呼叫 因為在這兩種情況下都可以將類變數繫結到 classmethod修飾的方法的第乙個引數上 classmethod def eat cls print eating.當類的例項動態新增屬性時 c...