我编写了一个函数,它将采用通用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>
。有什么我做错了吗?
提前致谢!
我很抱歉所有的困惑。我问错了。亚历克斯已经给了我足够的帮助,谢谢!
答案 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)