C# 一旦我';我查过它的型号了吗?
我有一个通用方法,它接受T类型的可枚举项。如果T也是可枚举项,我需要将它传递给另一个函数。然而,由于该函数只接受可枚举项,并且T是泛型的,所以它不会编译。 在通过之前,我会检查T是否是可枚举的,但显然不能解决这个问题 我该怎么做 (显然,我可以编写另一个只接受IEnumerableC# 一旦我';我查过它的型号了吗?,c#,generics,C#,Generics,我有一个通用方法,它接受T类型的可枚举项。如果T也是可枚举项,我需要将它传递给另一个函数。然而,由于该函数只接受可枚举项,并且T是泛型的,所以它不会编译。 在通过之前,我会检查T是否是可枚举的,但显然不能解决这个问题 我该怎么做 (显然,我可以编写另一个只接受IEnumerable的方法,并在相关的地方使用它,但这似乎不雅观。) 例如: public static bool EnumerablesAreEqual<T>(IEnumerable<T> a, IEnumera
public static bool EnumerablesAreEqual<T>(IEnumerable<T> a, IEnumerable<T> b)
{
foreach (T x in a)
{
if (x is Enumerable && !EnumerableContainsEnumerable(x, b))
return false;
if (!b.Contains(x))
return false;
}
...
}
公共静态bool EnumerablesAreEqual(IEnumerable a,IEnumerable b)
{
foreach(T x in a)
{
if(x是可枚举的&!EnumerableContainsEnumerable(x,b))
返回false;
如果(!b.包含(x))
返回false;
}
...
}
我已经看过了,但我不认为这是完全相同的问题。检查变量的动态类型这一事实并没有改变它的静态类型,它用于检查调用的内容也没有改变 如果你想这样做,你需要一个演员。您可以使用选中的强制转换一次性完成:
Enumerable ex = x as Enumerable;
if (ex != null && !EnumerableContainsEnumerable(ex, b))
return false;
as
操作员检查强制转换是否可行:如果可行,将返回强制转换的对象;如果不是,它将返回null
检查变量的动态类型不会更改其静态类型,并且它用于检查调用的内容
如果你想这样做,你需要一个演员。您可以使用选中的强制转换一次性完成:
Enumerable ex = x as Enumerable;
if (ex != null && !EnumerableContainsEnumerable(ex, b))
return false;
as
操作员检查强制转换是否可行:如果可行,将返回强制转换的对象;如果不是,它将返回null
您的x是可枚举的
中的可枚举的
是什么?你是指接口IEnumerable
还是接口IEnumerable
,或者这是某个类
?类System.Linq.Enumerable
不可能,因为这是一个静态类…a
和b
是相同类型的集T
,但是b
可能包含a
的集。EnumerableContainsEnumerable是一种检查集b是否包含集x的方法(我将交换参数的顺序,这样更明显)你的x是可枚举的
?你是指接口IEnumerable
还是接口IEnumerable
,或者这是某个类
?类系统。Linq.可枚举的
不能是因为那是一个静态类
…a
和b
是相同类型的集合T
,但b
可能包含包含a
的集合?EnumerableContainsEnumerable是一种检查集合b是否包含集合x的方法(我将交换参数的顺序,以便更明显)。这是一个很好的解决方案,但取决于Enumerable
是什么,T
和Enumerable
之间可能不允许进行转换。您是否假设它是一个接口?但我“无法声明静态类型System.Linq.Enumerable的变量”。有可能将ex声明为泛型类型的IEnumerable吗?@Ollyver:但是如果它是静态类型,那么x
就不能是那种类型!也许你在用同一个名称混合几种不同的类型…这基本上是我的问题-你的示例是如何工作的?因为如果我使用那个确切的代码,我会将ex声明为静态类型,而h不可能;如果我将ex声明为IEnumerable,我将再次使用动态类型检查。@奥利弗:现在我不明白这个问题……在你的OP中,你说x是可枚举的
,而可枚举的
也不能是静态类型。如果你的代码可以编译,我的代码也应该如此。记住,有不止一个type在.NET中命名为Enumerable
。这是一个很好的解决方案,但取决于Enumerable
是什么,T
和Enumerable
之间可能不允许进行转换。您是否假设它是一个接口?但我“无法声明静态类型System.Linq.Enumerable的变量”。有可能将ex声明为泛型类型的IEnumerable吗?@Ollyver:但是如果它是静态类型,那么x
就不能是那种类型!也许你在用同一个名称混合几种不同的类型…这基本上是我的问题-你的示例是如何工作的?因为如果我使用那个确切的代码,我会将ex声明为静态类型,而h不可能;如果我将ex声明为IEnumerable,我将再次使用动态类型检查。@奥利弗:现在我不明白这个问题……在你的OP中,你说x是可枚举的
,而可枚举的
也不能是静态类型。如果你的代码可以编译,我的代码也应该如此。记住,有不止一个ty在.NET中命名为可枚举的pe。