Generic ConvertTo?

本文关键字:ConvertTo Generic | 更新日期: 2023-09-27 18:27:45

我正试图弄清楚如何在使用反射和泛型的同时执行某种ConvertTo

我有两个具有属性的具体文件(可以是:简单类型、可为null的时间、DateTime)

我想在这些文件之间进行映射。一个是源文件,一个是目标文件。

我遇到了一个问题,我该如何转换?假设我有一个看起来像GUID的字符串。我该如何转换?

然而,我需要同时处理字符串到int、double、decmial或其他什么。

我知道有一些映射器,比如automapper和injecter,但由于我的名字不匹配,所以很难使用它们,因为没有真正的命名约定。我实际上有第三个文件,将有所有的名称和他们映射到什么。

示例

源类

 public class Source
    {
        public string test1 { get; set; }
        public int test2 { get; set; }
        public int? test3 { get; set; }
        public double test4 { get; set; }
        public double? test5 { get; set; }
        public DateTime test6 { get; set; }
        public DateTime? test7 { get; set; }
        public int test8 { get; set; }
        public string test9 { get; set; }
    }
 Source source = new Source()
            {
                test1 = "hi",
                test2 = 1,
                test3 =  null,
                test4 = 50.50,
                test5 = null,
                test6 = DateTime.Now,
                test7 = null,
                test8 = 50,
                test9 = Guid.NewGuid().ToString()                    
            };

目的地

 public class Destination
    {
        public string Test1 { get; set; }
        public int Test2 { get; set; }
        public int? Test3 { get; set; }
        public double Test4 { get; set; }
        public double? Test5 { get; set; }
        public DateTime Test6 { get; set; }
        public DateTime Test7 { get; set; }
        public double Test8 { get; set; }
        public Guid Test9 { get; set; }
    }

在你说automapper可以处理小写和大写之前——这只是一个例子——我在实际项目中的大小写有很大不同。我正在尝试将double转换为int,将string转换为guid。

这是我的地图文件

{
  "test1": {
    "to": "Test1"
  },
  "test2": {
    "to": "Test2"
  },
  "test3": {
    "to": "Test3"
  },
  "test4": {
    "to": "Test4"
  },
  "test5": {
    "to": "Test5"
  },
  "test6": {
    "to": "Test6"
  },
  "test7": {
    "to": "Test7"
  },
  "test8": {
    "to": "Test8"
  },
  "test9": {
    "to": "Test9"
  }
}

Generic ConvertTo?

我将从第三个文件开始,构建一个Dictionary<字符串,类型>将名称映射到C#类型。您没有提供文件的示例,所以这里只提供示例代码:

Dictionary<String, Type> map = new Dictionary<String, Type>();
foreach(KeyValuePair<String, String> nameToTypeName in entry_in_third_file)
{
    map.Add(nameToTypeName.Key, Type.GetType(nameToTypeName.Value));
}

下一次实际转换:

foreach (KeyValuePair<String, String> nameAndValue in entry_in_properties)
{
    Type targetType = map[nameAndValue.Key];
    String value = nameAndValue.Value;
    Object convertedValue = System.Convert.ChangeType(value, targetType);
}

当然,这只是一个基本的例子,如果不仔细查看这些文件,很难知道更多。您需要根据转换的方向创建类型字典。

此外,这只是用于简单的字符串到对象的转换。如果你需要更复杂的东西,那么看看TypeConverter,它允许你为你需要的每种类型创建自己的转换类。