我通过反射收到的两个参数可能是不同的类型。
object array;
object value;
...
array=new int[] { 1,2,3};
value=3;
...
array=new string[] { "one","two","three"};
value="two";
我想找出value
是否在array
内,无论哪种类型。
以下命令不不会编译:
bool isInside=Array.Exists(array, q=>q==value);
不能从用法中推断出方法'Array.Exists(T [],Predicate)'的类型参数。尝试显式指定类型参数。
我如何实现我的目标?
答案 0 :(得分:2)
我想到的一种方法是将数组转换为Array
,然后使用for循环搜索它:
var castedArray = (Array)array;
for (int i = 0 ; i < castedArray.Length ; i++) {
if (castedArray.GetValue(i).Equals(value)) {
Console.WriteLine("It exists!");
break;
}
}
请注意,==
在这里不起作用,因为int
会被装箱。
如果您的数组只有一维,Array.IndexOf
也可以使用(castedArray
和value
),但是如果您还想处理2D或3D数组,则需要检查Rank
并使用嵌套的for循环。
答案 1 :(得分:1)
OS仍然是一个数组。因此,让我们先将变量定义为
thenApply()
数组是IEnumerable的,我们可以定义一个扩展类:
Array array;
object value;
并像这样使用它:
public static class EnumerableExtensions
{
public static bool HasItem(this IEnumerable enumerable, object value)
{
return enumerable.OfType<Object>().Any(e => e.Equals(value));
}
}
如果您需要它为真,则应在HasItem方法中添加一些转换逻辑
答案 2 :(得分:0)
请尝试这个
var dynamicArray = (object[])array;
bool isInside = dynamicArray.Contains(value);
答案 3 :(得分:0)
使用LINQ的强制性答案:
//using System.Linq;
//using System.Reflection;
public static bool IsInArrayUnkownType(object array, object obj)
{
Type type = array.GetType().GetElementType();
MethodInfo contains = typeof(System.Linq.Enumerable).GetMethods().Where(m => m.Name == "Contains").First();
MethodInfo containsUnGenericated = contains.MakeGenericMethod(new[] { type });
object result = containsUnGenericated.Invoke(null, new object[] { array, obj });
return (bool)result;
}
编辑:寻找其他解决方案时,我不会真正推荐这个解决方案,因为反射很慢,而其他人做得更好。