Generic ConvertTo?

时间:2015-12-23 00:42:21

标签: c# generics

我试图弄清楚在使用反射和泛型时我如何能够做某种ConvertTo

我有2个具有属性的具体文件(可能是:简单类型,可以为空的时间,DateTime)

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

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

然而,我需要在同一时间将字符串处理为int,double,decmial等等。

我知道有像自动播放器和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; }
    }

在你说自动播放器可以处理小写与大写之前并不仅仅是一个例子我的实际项目中的大小不同。我试图将double转换为int,将字符串转换为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"
  }
}

1 个答案:

答案 0 :(得分:1)

我将从第三个文件开始并构建一个Dictionary< String,Type>这会将名称映射到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,它允许你为你需要的每种类型创建自己的转换类。