C#使用Impromptu映射List到接口时遇RuntimeBinderException问题求助
解决Impromptu将List映射到接口时的RuntimeBinderException问题
我来帮你排查这个问题——你碰到的RuntimeBinderException本质原因是:你直接把List<FinalDecisionInformation>实例传给Impromptu.ActLike<IFinalDecisionEvaluate>,但Impromptu无法自动把整个List实例映射到接口的FinalDecisionList属性上。
问题根源
Impromptu.ActLike<T>的工作逻辑是基于动态类型模拟接口实现:它需要一个包含接口所有属性/方法的对象,才能将其“伪装”成接口类型。你直接传入List的话,Impromptu会尝试把List本身当作接口的实现,但List<T>并没有FinalDecisionList这个属性,所以当你访问该属性时,就会触发绑定异常。
解决方案
最简洁的修复方式是用匿名对象包装你的List,让匿名对象的属性名和接口的属性名完全匹配,这样Impromptu就能正确绑定属性:
List<FinalDecisionInformation> finalDecision = (List<FinalDecisionInformation>)serializer.Deserialize(stringReader); // 用匿名对象包装List,属性名和接口保持一致 var finalDecisionSend = Impromptu.ActLike<IFinalDecisionEvaluate>(new { FinalDecisionList = finalDecision });
如果你的场景需要更复杂的逻辑(比如后续要修改属性、添加方法),也可以手动实现接口:
// 实现IFinalDecisionEvaluate的具体类 public class FinalDecisionEvaluate : IFinalDecisionEvaluate { public List<FinalDecisionInformation> FinalDecisionList { get; set; } } // 使用时直接实例化赋值 var finalDecisionSend = new FinalDecisionEvaluate { FinalDecisionList = finalDecision };
第一种方式足够解决你当前的问题,因为匿名对象的FinalDecisionList属性和接口定义完全对齐,Impromptu可以完美模拟接口的行为。
内容的提问来源于stack exchange,提问作者Gerhardus Carinus
相关产品推荐
相关产品推荐

