c# - 使用接口(interface)实例调用泛型方法

标签 c# generics dynamic reflection interface

作为 this one 的后续问题

public interface IFeature  {  }

public class FeatureA : IFeature { }

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

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

}

我明白,一旦 FeatureA被转换到 IFeature通用方法总是会得到 IFeature作为类型参数。

我们有一项服务为我们提供列表功能 (List<IFeature>)。如果我们想遍历这些特性,在泛型方法中传递每个特性,我想除了

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

最佳答案

假设您可以修改您的代码库,您可以按如下方式使用访问者模式。否则,使用动态。

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);
    }
}

关于c# - 使用接口(interface)实例调用泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33409364/

相关文章:

c# - 如何在我的控制台应用程序中获取 Microsoft 图形结果?

C# 如何控制 MySql Connector 返回的日期时间格式

c# - 什么处理对 asp.net 页面中的 WebMethod 的请求

java - 通用对象工厂

C# 可以隐藏继承的接口(interface)吗?

C# 转发可变长度参数

json - 如何在 Dart 中使用带有 json 序列化的泛型和泛型列表?

C# 表达式树简单算术

c# - 动态、对象、变量

c - Valgrind 段错误无效写入大小 8 C