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

非ジェネリックにすることが許可されている場合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 に答える
1

Type.GetGenericTypeDefinition()を使用し、その結果を と比較しtypeof(ICollection<>)ます。

したがって、メソッドの戻り値の型が であるかどうかを確認するには、次のICollectionようにします。

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

ところで。最初のオペランドの型が 2 番目のオペランドのサブタイプであるかどうかをチェックするmethod.ReturnType is ICollection<a>ため、true になることはありません。some のサブタイプではない型です。isReturnTypeTypeICollection

于 2012-11-11T03:13:32.113 に答える
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 に答える