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



作为这个的后续问题

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

您可以使用typeof:获得泛型/(非泛型)类型的类型对象

    public static T Parse<T>(String value)
    {
        object result = default(T);
        var typeT = typeof (T);
        if (typeT == typeof(Guid))
        {
            result = new Guid(value);
        }
        else if (typeT == typeof(TimeSpan))
        {
            result = TimeSpan.Parse(value);
        }
        else
        {
            result = Convert.ChangeType(value, typeT);
        }
        return (T)result;
    }

我的简单方法返回T。这是一个关键点。它必须是泛型的,以允许开发人员指定返回类型。若方法不返回泛型,而只接受一个,那个么有几个理由使它成为泛型。为了避免对方法参数执行box/unbox操作,或者处理方法采用不同类型的参数时的情况,这些参数不是从公共基类/接口继承的。这不是你的情况。因此,代码中的方法不必是泛型的。只需将参数键入为IFeature,并使用/as/GetType():

private static void Activate(IFeature feature) 
{
   if (feature is FeatureImplementationA)
   {
      //Do something...
   }
}

相关内容

  • 没有找到相关文章

最新更新