Activator.CreateInstance with string

时间:2015-02-14 23:43:39

标签: c# generics activator

我正在尝试填充一个通用List< T>来自另一个列表< U>字段名称匹配的位置,如下面未经测试的伪代码。我遇到问题的地方是T是一个字符串,例如,它没有无参数构造函数。我试过直接在结果对象中添加一个字符串,但是这给了我一个明显的错误 - 一个字符串不是T型。任何关于如何解决这个问题的想法?谢谢你的任何指示。

    public static List<T> GetObjectList<T, U>(List<U> givenObjects)
    {
        var result = new List<T>();

        //Get the two object types so we can compare them.
        Type returnType = typeof(T);
        PropertyInfo[] classFieldsOfReturnType = returnType.GetProperties(
           BindingFlags.Instance |
           BindingFlags.Static |
           BindingFlags.NonPublic |
           BindingFlags.Public);

        Type givenType = typeof(U);
        PropertyInfo[] classFieldsOfGivenType = givenType.GetProperties(
           BindingFlags.Instance |
           BindingFlags.Static |
           BindingFlags.NonPublic |
           BindingFlags.Public);

        //Go through each object to extract values
        foreach (var givenObject in givenObjects)
        {

            foreach (var field in classFieldsOfReturnType)
            {
                //Find where names match
                var givenTypeField = classFieldsOfGivenType.Where(w => w.Name == field.Name).FirstOrDefault();

                if (givenTypeField != null)
                {
                    //Set the value of the given object to the return object
                    var instance = Activator.CreateInstance<T>();
                    var value = field.GetValue(givenObject);

                    PropertyInfo pi = returnType.GetProperty(field.Name);
                    pi.SetValue(instance, value);

                    result.Add(instance);
                }

            }
        }

        return result;
    }

1 个答案:

答案 0 :(得分:2)

如果Tstring并且您已创建自定义代码以将givenObject转换为字符串,则只需intermediate cast object List<T>将其添加到 public static List<T> GetObjectList2<T, U>(List<U> givenObjects) where T : class { var result = new List<T>(); if (typeof(T) == typeof(string)) { foreach (var givenObject in givenObjects) { var instance = givenObject.ToString(); // Your custom conversion to string. result.Add((T)(object)instance); } } else { // Proceed as before } return result; }

instance

顺便提一下,您要为{{1>} T result添加T U的每个属性,其匹配givenObjects中的属性名称1}}以及givenObjects中的每个项目。即如果T是长度为1的列表,而result是具有10个匹配属性的类,则List<U>最终可能会有10个条目。这看起来不错。此外,您需要注意indexed properties

作为此方法的替代方法,请考虑使用Automapper,或使用Json.NET将List<T>序列化为JSON,然后将其反序列化为{{1}}。