[英]Generic method with Action<T> parameter
所以,我確信之前已在某處回答過,但我無法在任何地方找到它。 希望一些仿制葯大師可以提供幫助。
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
}
編輯:基於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方法,如下所示:
ValidateUsing(Foo);
不幸的是,如果foo看起來像這樣:
private void Foo(Orangutan obj)
{
//Do something
}
我在調用ValidateUsing時必須明確指定類型
ValidateUsing<Orangutan>(Foo);
如果你應該接受任何IAnimal
你為什么要實例化Orangutan
呢?
public void ValidateUsing<T>(Action<T> action) where T : IAnimal, new()
{
T animal = new T();
action(animal); //Compile error 2
如果您重用通用參數,則不會出現任何類型問題......
現在,關於為什么你的代碼不起作用,你所說的只是類型T
將從IAnimal
派生。 然而,它也很容易成為一個Giraffe
作為Orangutan
,所以你不能只分配一個Orangutan
或IAnimal
到類型的參數T
。
問題是,T表示某種類型,它通過實現IAnimal的方式。
所以,當你嘗試編譯action(new Organatum())
你得到一個錯誤,因為你已經聲明該動作應該采用類型為T
的參數,而這個參數又可以是類型,比方說, Fish
- 你不能把Organatum
一條Fish
,可以嗎?
如果要觸發任何采用實現IAnimal
接口的類型參數的操作,那么只需忘記泛型並使用Action<IAnimal>
。
HTH。
試試這個。
Orangutan orangutan = new Orangutan();
Action<IAnimal> castedAction = action as Action<IAnimal>;
castedAction(orangutan);
進行以下更改:
Orangutan orangutan = new Orangutan();
action((T)(IAnimal)orangutan);
IAnimal animal = new Orangutan();
action((T)animal);
public interface IAnimal { }
public class Orangutan : IAnimal { }
public void ValidateUsing<T>(Action<T> action) where T : IAnimal
{
Orangutan orangutan = new Orangutan();
action((T)(orangutan as IAnimal)); // needs to be cast as IAnimal
//This doesn't work either:
IAnimal animal = new Orangutan();
action((T)animal); // needs to be cast as T
}
它似乎也是一個事實,它是一個界面有所作為。 如果你有一個抽象類Animal,而不是一個接口,你可以這樣做:
public abstract class Animal { }
public class Orangutan : Animal { }
public void ValidateUsing<T>(Action<T> action) where T : Animal
{
Orangutan orangutan = new Orangutan();
action(orangutan as T);
//This doesn't work either:
Animal animal = new Orangutan();
action(animal as T);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.