亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何通過反射設置作為通用接口的字段的值?

如何通過反射設置作為通用接口的字段的值?

C#
蠱毒傳說 2022-09-04 16:51:43
我希望能夠使用反射來獲取類的成員,例如,IList 類型,并且我想為它創建一個委托,以便我為反射支付更少的費用。所有這一切,為了在晚些時候,我能夠通過傳遞我的實例和一個新的列表來呼叫代表。每當我嘗試這樣做時,C#都會給我無效的強制轉換異常。我是否遺漏了泛型的愚蠢之處?我嘗試過使用沒有泛型的界面字段,這些字段似乎工作得很好。我似乎只在使用泛型時遇到問題。我還嘗試使用Convert.ChangeType將我的輸入轉換為所需的類型,并且我收到了有關List的錯誤<>沒有實現IConvertible。如果我可以使用反射從具體的List<>類型設置一個值<>我將很高興:)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);        }    }}預期的結果是,我能夠將“setter”緩存到屬性中,并支持設置任何類型的值,包括泛型和接口。我目前的結果是,設置任何類型的值都有效,除非有泛型...所以我一定是做錯了什么。
查看完整描述

1 回答

?
莫回無

TA貢獻1865條經驗 獲得超7個贊

您的 lambda 調用是錯誤的。您必須在 lambda 對象上調用該方法,該對象傳遞目標以及參數。Invoke


如果修復調用,您將獲得所需的結果:


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


查看完整回答
反對 回復 2022-09-04
  • 1 回答
  • 0 關注
  • 98 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號