簡體   English   中英

Action的通用方法 <T> 參數

[英]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
}
  1. 參數類型'T'不能賦予參數類型'Orangutan'
  2. 參數類型'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方法,如下所示:

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 ,所以你不能只分配一個OrangutanIAnimal到類型的參數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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM