使用接口实例调用泛型方法

Der*_*Ape 6 c# generics reflection interface dynamic

作为对此的后续问题

public interface IFeature  {  }

public class FeatureA : IFeature { }

IFeature a = new FeatureA();
Activate(a);

private static void Activate<TFeature>(TFeature featureDefinition) where TFeature : IFeature
{

}
Run Code Online (Sandbox Code Playgroud)

我没有理解,一旦将FeatureA其转换IFeature为泛型方法,它将始终IFeature作为类型参数获取.

我们有一项服务,为我们提供了一个列表功能(List<IFeature>).如果我们想迭代这些特性,在泛型方法中传递每个特征,我想没有办法在泛型方法中获得具体类型而不是

由于反射非常昂贵,我想使用动态强制转换.以这种方式调用方法有什么缺点吗?不知怎的,我这样做时感觉很脏:-)

Sri*_*vel 5

假设您可以修改代码库,则可以使用以下访问者模式.否则,使用动态.

public interface IFeature
{
    void Accept(Visitior visitor);
}

public class FeatureA : IFeature
{
    public void Accept(Visitior visitor)
    {
        visitor.Visit(this);
    }
}

public class FeatureB : IFeature
{
    public void Accept(Visitior visitor)
    {
        visitor.Visit(this);
    }
}

public class Visitior
{
    public void Visit<TFeature>(TFeature feature) where TFeature : IFeature
    {
        Console.WriteLine(typeof(TFeature) == feature.GetType());//True
    }
}

static void Main(string[] args)
{
    List<IFeature> features = new List<IFeature>
    {
         new FeatureA(),
         new FeatureB()
    };

    Visitior visitor = new Visitior();
    foreach (var item in features)
    {
        item.Accept(visitor);
    }
}
Run Code Online (Sandbox Code Playgroud)