我希望能夠使用反射來獲取類的成員,例如,IList 類型,并且我想為它創(chuàng)建一個委托,以便我為反射支付更少的費用。所有這一切,為了在晚些時候,我能夠通過傳遞我的實例和一個新的列表來呼叫代表。每當(dāng)我嘗試這樣做時,C#都會給我無效的強制轉(zhuǎn)換異常。我是否遺漏了泛型的愚蠢之處?我嘗試過使用沒有泛型的界面字段,這些字段似乎工作得很好。我似乎只在使用泛型時遇到問題。我還嘗試使用Convert.ChangeType將我的輸入轉(zhuǎn)換為所需的類型,并且我收到了有關(guān)List的錯誤<>沒有實現(xiàn)IConvertible。如果我可以使用反射從具體的List<>類型設(shè)置一個值<>我將很高興:)using System;using System.Collections.Generic;using System.Linq.Expressions;using System.Reflection;public class MyObject{ public IList<int> MyField;}public class ReflectionPerfTesting{ public void Run() { var testObject = new MyObject(); var field = testObject.GetType().GetField("MyField", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); InvokeUsingReflection(field, testObject); } private void InvokeUsingReflection(FieldInfo fieldInfo, object testObject) { var fieldType = fieldInfo.FieldType; var sourceType = fieldInfo.DeclaringType; // ZAS: create value parameter var valueParam = Expression.Parameter(fieldType); // ZAS: create targetParameter var sourceParam = Expression.Parameter(sourceType); var field = Expression.Field(sourceParam, fieldInfo); var returnExpression = (Expression)Expression.Assign(field, valueParam); if (!fieldType.IsClass) { returnExpression = Expression.Convert(returnExpression, fieldType); } }}預(yù)期的結(jié)果是,我能夠?qū)ⅰ皊etter”緩存到屬性中,并支持設(shè)置任何類型的值,包括泛型和接口。我目前的結(jié)果是,設(shè)置任何類型的值都有效,除非有泛型...所以我一定是做錯了什么。
1 回答

莫回?zé)o
TA貢獻1865條經(jīng)驗 獲得超7個贊
您的 lambda 調(diào)用是錯誤的。您必須在 lambda 對象上調(diào)用該方法,該對象傳遞目標(biāo)以及參數(shù)。Invoke
如果修復(fù)調(diào)用,您將獲得所需的結(jié)果:
testObject.Dump();
var list = new List<int>();
lambdaInvokeMethod.Invoke(lambda, new object[] { testObject, list });
testObject.Dump();
Dumping object(MyObject)
MyField : null
Dumping object(MyObject)
MyField : []
請參見: https://dotnetfiddle.net/FZN3iX
- 1 回答
- 0 關(guān)注
- 91 瀏覽
添加回答
舉報
0/150
提交
取消