使用通用IEnumerable <t>

时间:2016-11-15 11:56:17

标签: c# generics

我编写了一个函数,它将采用通用IEnumerable并将这些对象(如果可能)映射到我想用于算法的对象。我对通用对象或IEnumberables没有太多经验,所以我想问一些建议。

我写了这段代码:

public static IEnumerable<OtherObject> MyObjectToOtherObject<T>(IEnumerable<T> objects)
    {
        if (objects.GetType() == typeof(MyObject))
        {
            var data = (IEnumerable<MyObject>)objects;
            return data.Select(x => new OtherObject() { // Map the attributes });
        }
        else
            return null;
    }

这在我的代码中不起作用,因为即使输入列表的类型为MyObject,它也会返回null。我无法弄清楚如何将IEnumerable<T>投射到IEnumerable<MyObject>。有什么我做错了吗?

提前致谢!

我很抱歉所有的困惑。我问错了。亚历克斯已经给了我足够的帮助,谢谢!

4 个答案:

答案 0 :(得分:1)

这是错的。

objects.GetType() == typeof(MyObject)

正确:

objects.GetType() == typeof(IEnumerable<T>)

如果您需要比较嵌套项的类型:

objects.GetType().GetGenericArguments()[0] == typeof(MyObject)
typeof(T) == typeof(MyObject)

如果您正在检查类型是否可以转换为其他类型:

objects.GetType().GetGenericArguments()[0].IsAssignableFrom(typeof(MyObject))

或仅作为

typeof(T).IsAssignableFrom(typeof(MyObject))

答案 1 :(得分:0)

看起来你不需要通用方法,如果你总是知道源和目的地类型,你可以这样做:

public static IEnumerable<DestObject> ObjectToObject1(IEnumerable<SourceObject> objects)
{                
    return data.Select(x => new DestObject() { // Map the attributes });

}

答案 2 :(得分:0)

我认为您尝试做的是构建一个通用映射方法,可以将任何给定T映射到您的具体类Object1。您需要提供映射函数来执行映射。

说你有这个(过度设计)的例子:

public class SourceObject
{
    public string AString{get;set;}
}

public class DestObject
{
    public string TheProperty{get;set;}
}

您首先要使用IEnumerable<SourceObject>方法获取列表,然后使用Func<SourceObject,DestObject>进行映射

var input = new List<SourceObject>(){
    new SourceObject{AString="Str1"},
    new SourceObject{AString="Str2"}
};

var result = MyObjectToOtherObject(input, x =>  new DestObject{TheProperty = x.AString});

这样就完成了:

public static IEnumerable<DestObject> MyObjectToOtherObject<T>(IEnumerable<T> objects, Func<T,DestObject> mapping)
{
    return data.Select(mapping);
}

正如您所看到的,此时单独的方法或多或少无用。这正是Select的作用。

答案 3 :(得分:0)

objects永远不会是MyObject类型,因此

(objects.GetType() == typeof(MyObject))

将始终返回false,因为object是一些通用集合(IEnumerable<T>)。

您可以尝试使用

typeof(T) == typeof(MyObject)