为了账号安全,请及时绑定邮箱和手机立即绑定

使用反射映射相似对象:对象与目标类型不匹配

使用反射映射相似对象:对象与目标类型不匹配

PHP
肥皂起泡泡 2021-06-11 15:09:59
尽管查看了多个 SO 帖子和我能想到的任何其他内容,但我在这里完全不知所措。我的目标是制作一个非常非常简单的映射器。我基本上可以在某些单元测试中用作工具的东西。它不需要很复杂或任何东西——只需将一个对象的高级原始值和字符串值映射到另一个对象。所以基本算法是:获取所有属性 TFrom获取所有属性 TTo获取两者中的所有属性,按名称匹配。我知道这可能是一个错误,因为它们可能具有相同的名称但类型不同,但让我们把它放在一边。这不是我在这里遇到的问题——属性和类型在类之间匹配。创建一个TTo我们可以复制到的实例。对于在对象之间映射的每个属性:获取from对象的值将值转换为属性的类型在to对象上设置值问题是,无论我做什么,无论属性的类型是什么(int或者string,例如),我都会得到以下信息:对象与目标类型不匹配。这是我正在使用的代码:public TTo Map<TFrom, TTo>(TFrom from){    if (from == null) return default;    var fromProps = GetProperties(typeof(TFrom));    var toProps = GetProperties(typeof(TTo));    // Props that can be mapped from one to the other    var propsToCopy = fromProps.Intersect(toProps, new PropertyComparer()).ToList();    var returnObject = (TTo)Activator.CreateInstance(typeof(TTo));    foreach (var prop in propsToCopy)    {        // Copy the values        var fromValue = prop.GetValue(from, null);        var convertedValue = Convert.ChangeType(fromValue, prop.PropertyType);        prop.SetValue(returnObject, convertedValue, null);    }    return returnObject;}public PropertyInfo[] GetProperties(Type objectType){    var allProps = objectType.GetProperties(        BindingFlags.Public | BindingFlags.Instance);    return allProps.Where(p => p.PropertyType.IsPrimitive ||        p.PropertyType == typeof(string)).ToArray();}private class PropertyComparer : IEqualityComparer<PropertyInfo>{    public bool Equals(PropertyInfo x, PropertyInfo y)    {        return x.Name.Equals(y.Name);    }    public int GetHashCode(PropertyInfo obj)    {        return obj.Name.GetHashCode();    }}这是我将其称为示例类的示例:public class Foo {    public string StringProp { get; set; }    public int IntProp { get; set; }}public class FooOther{    public string StringProp { get; set; }    public int IntProp { get; set; }}var foo = new Foo { IntProp = 1, StringProp = "foo" };var mappedFoo = Map<Foo, FooOther>(foo);我从 Visual Studio 中得到的唯一提示来自监视窗口:如果属性类型是 a string,监视窗口报告的类型为convertedValueas object。如果属性类型是int,监视窗口会报告object {int}。
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 520 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信