2

所以我有,比如说,这种方法:

public ICollection<String> doSomething() { }

目前,我正在尝试检查方法的返回类型是否为 ICollection 类型。但是,在 C# 中,我必须在进行检查时传入一个泛型。所以我不能说,“方法是 ICollection”。

问题是我不想在检查时限制泛型的类型。在 Java 中,我可以只使用通配符,但在 C# 中我不能这样做。我曾想过尝试使用 Type.GetGenericParamterContraints() 并尝试将它的第一个结果粘贴在 ICollection 的通用约束中进行检查,但这也没有用。有人有什么想法吗?

isCollection(MethodInfo method){
    Type[] ret = method.ReturnType.GetGenericParametersContraint();
    Type a = ret[0];
    return method.ReturnType is ICollection<a>;
}

编辑:添加了我尝试过的内容。

4

5 回答 5

1

你应该能够做到:

MethodInfo method = ... // up to you
var returnType = method.ReturnType;

var isGenericICollection = returnType == typeof(ICollection<>);
于 2012-11-11T03:04:54.217 回答
1

使用Type.GetGenericTypeDefinition(),并将其结果与typeof(ICollection<>).

因此,要检查您的方法的返回类型是否为 an ICollection,您可以这样做:

method.ReturnType.GetGenericTypeDefinition() == typeof(ICollection<>)

顺便提一句。method.ReturnType is ICollection<a>永远不会为真,因为is检查第一个操作数的类型是否是第二个操作数的子类型。ReturnType是 typeType虽然它不是 some 的子类型ICollection

于 2012-11-11T03:13:32.113 回答
1

如果允许它是非泛型的System.Collections.ICollection(也由它实现ICollection<T>),那么它很简单:

typeof(System.Collections.ICollection).IsAssignableFrom(method.ReturnType)

如果您只想与通用比较ICollection<T>(我认为没有理由,但您可能有自己的理由):

method.ReturnType.IsGenericType 
  && typeof(ICollection<>)
  .IsAssignableFrom(method.ReturnType.GetGenericTypeDefinition())

请注意,如果返回类型是非泛型的,这将不起作用。ICollection<T>因此,如果有一个实现但本身不是泛型的类,它将不起作用。这意味着它不会捕获class Foo : ICollection<string>,但它捕获class Foo<T> : ICollection<T>

第一种方法会很好地抓住两者。

于 2012-11-11T04:09:07.650 回答
0

试试这个,使用MethodInfo.ReturnType来确定返回类型

Use the below method, call `isCollection<string>(method)` 

public static bool isCollection<T>(MethodInfo method)
{
    return method.ReturnType.Equals(typeof(ICollection<T>));
}
于 2012-11-11T03:50:26.457 回答
0

试试这个:

class Program
{
    public ICollection<string> Foo() { return new List<string>(); } 
    public static bool TestType()
    {
        MethodInfo info = typeof(Program).GetMethod("Foo");

        return info.ReturnType.GetGenericTypeDefinition() == typeof(ICollection<>);
    }
    static void Main(string[] args)
    {
        Console.WriteLine("{0} is ICollection<> : {1}", "Foo", TestType());
    }
}

打印Foo is ICollection<> : True

于 2012-11-11T04:31:54.837 回答