让我们说出以下类型:
public class Object { }
public class GameObject : Object { }
public class Component : Object { }
public class Transform : Component { }
两个Type[]
var t1 = new [] { typeof(Object), typeof(Component) };
var t2 = new [] { typeof(GameObject), typeof(Transform) };
扩展方法:
Console.Writeline(t1.IsAssignableFrom(t2); // prints true
我以基本的方式编写了这个方法:
public static bool IsAssignableFrom(this Type[] to, Type[] from)
{
if (to.Length != from.Length) return false;
for (int i = 0; i < to.Length; i++) {
if (!to[i].IsAssignableFrom(from[i]))
return false;
}
return true;
}
但是不能用LINQ方式写它...... - 不知道使用什么方法:s
有什么想法吗?
谢谢!
答案 0 :(得分:5)
我怀疑你只是在寻找:
return to.Length == from.Length &&
to.Zip(from, (t, f) => t.IsAssignableFrom(f))
.All(x => x);
这里对Zip
的调用只是将两个序列的第一个元素相互拉开,然后是第二个元素等 - 在每对上应用指定为(t, f) => t.IsAssignableFrom(f)
的操作。 All
只检查结果序列是否为真。
根据您的调用方式,可能想让长度不同的错误,而不是只返回false
:
if (to.Length != from.Length)
{
throw new ArgumentException("...");
}
return to.Zip(from, (t, f) => t.IsAssignableFrom(f))
.All(x => x);
答案 1 :(得分:1)
这是另一种解决方案:
public static bool IsAssignableFrom(this Type[] to, Type[] from)
{
if (to.Length != from.Length) return false;
return to.Select((type, idx) => new { type, idx })
.All((x) => x.type.IsAssignableFrom(from[x.idx]));
}
或者:
int i = 0;
return to.All(x => x.IsAssignableFrom(from[i++]));