gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:38:39 26 4
gpt4 key购买 nike

作为 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com