vba獲取標籤屬性值 C 高效能動態獲取物件屬性值

2021-10-12 04:46:10 字數 3432 閱讀 4021

動態獲取物件的效能值,這個在開發過程中經常會遇到,這裡我們**一下何如高效能的獲取屬性值。為了對比測試,我們定義乙個類people

public class people

}

private static void directly()

; stopwatch stopwatch = stopwatch.startnew();

for (int i = 0; i < 10000000; i++)

stopwatch.stop();

console.writeline("directly: ms", stopwatch.elapsedmilliseconds);

}

大概花了37ms:

}大概花了1533ms,果然要慢很多:

那既然反射慢,那還有沒有其它方式呢?

我們知道可以動態構建linq的lambda表示式,然後通過編譯後得到乙個委託,如果能動態構建返回屬性值的委託,就可以取到值了。所以我們想辦法構建乙個像這樣的委託:

funcgetname = m => m.name;
接下來我們就通過expression來構建:

private static void lambda()

; type type = typeof(people);

var parameter = expression.parameter(type, "m");//引數m

propertyinfo property = type.getproperty("name");

expression expproperty = expression.property(parameter, property.name);//取引數的屬性m.name

var propertydelegateexpression = expression.lambda(expproperty, parameter);//變成表示式 m => m.name

var propertydelegate = (func)propertydelegateexpression.compile();//編譯成委託

stopwatch stopwatch = stopwatch.startnew();

for (int i = 0; i < 10000000; i++)

stopwatch.stop();

console.writeline("lambda:ms", stopwatch.elapsedmilliseconds);

}

然後我們測試一下,大概花了138ms,效能要比反射好非常多:

雖然動態構建lambda的效能已經很好了,但還是更好嗎?畢竟比直接呼叫還是差了一些,要是能直接呼叫屬性的取值方法就好了。

在c#中,可讀屬性都有乙個對應的get_***()的方法,可以通過呼叫這個方法來取得對應屬性的值。可以使用system.delegate.createdelegate建立乙個委託來呼叫這個方法。

我們定義乙個membergetdelegate的委託,然後通過它來呼叫取值方法:

delegate object membergetdelegate(people p);

private static void delegate()

; type type = typeof(people);

propertyinfo property = type.getproperty("name");

membergetdelegate memberget = (membergetdelegate)system.delegate.createdelegate(typeof(membergetdelegate), property.getgetmethod());

stopwatch stopwatch = stopwatch.startnew();

for (int i = 0; i < 10000000; i++)

stopwatch.stop();

console.writeline("delegate: ms", stopwatch.elapsedmilliseconds);

}

然後我們測試一下,大概花了38ms,效能幾乎與直接呼叫一致:

最後做乙個簡單的封裝,快取一下建立的delegate

public class propertyvalue

public t target

public object get(string name)

private membergetdelegate builddelegate(string name)

}

這樣使用起來就方便多了

people people = new people ;

propertyvaluepropertyvalue = new propertyvalue(people);

object value = propertyvalue.get("name");

c#高效能動態獲取物件屬性值​www.zkea.net

C 反射設定屬性值和獲取屬性值

獲取類中的屬性值 public string getmodelvalue string fieldname,object obj catch 設定類中的屬性值 public bool setmodelvalue string fieldname,string value,object obj cat...

C 反射設定屬性值和獲取屬性值

獲取類中的屬性值 public string getmodelvalue string fieldname,object obj catch 設定類中的屬性值 public bool setmodelvalue string fieldname,string value,object obj cat...

C 反射設定屬性值和獲取屬性值

獲取類中的屬性值 public string getmodelvalue string fieldname,object obj catch 設定類中的屬性值 public bool setmodelvalue string fieldname,string value,object obj cat...