これは前にどこかで回答されていると確信していますが、どこでも見つけることができませんでした。いくつかのジェネリックの達人が助けてくれることを願っています。アクションを伴う汎用メソッド<T>パラメータ
public interface IAnimal{}
public class Orangutan:IAnimal{}
public void ValidateUsing<T>(Action<T> action) where T : IAnimal
{
Orangutan orangutan = new Orangutan();
action(orangutan); //Compile error 1
//This doesn't work either:
IAnimal animal = new Orangutan();
action(animal); //Compile error 2
}
- 引数の型 'オランウータンは' タイプのパラメーターに割り当てない 'T'
- 引数の型 'IAnimalは 'T'
編集パラメータのタイプに割り当て可能ではありません。ベースYuriyと他の提案のでは、次のようなキャストを行うことができます:
public void ValidateUsing<T>(Action<T> action) where T : IAnimal
{
Orangutan orangutan = new Orangutan();
action((T)(IAnimal)orangutan);
//This doesn't work either:
IAnimal animal = new Orangutan();
action((T)animal);
}
ValidateUsing(Foo);
残念なことに、fooは次のようになります場合:
private void Foo(Orangutan obj)
{
//Do something
}
私は
をValidateUsing呼び出すときに、明示的に型を指定する必要があり、私がやってみたかった事は、このようValidateUsingメソッドを呼び出しましたValidateUsing<Orangutan>(Foo);
おかげさまで、オランウータンを例として使用しました。おそらく悪い。私は任意のIAnimalでアクションを呼び出せるようにしたい。 "実際の"コードでは、IAnimalはクラスのプライベートフィールドとして格納されます。だから、私は何もインスタンス化していません。 –