4

我需要帮助将通用参数转换为接口。

我有这样的预烘焙代码:

public interface InterFoo<T> {...}
public InterFoo<T> specialFoo<T>() where T : InterFoo<T> {...}
public InterFoo<T> regularFoo<T>() {...}

我想实现这样的东西

public InterFoo<T> adaptiveFoo<T>()
{
    if (T is InterFoo<T>)
        return specialFoo<T as InterFoo>();
    return regularFoo<T>();
}

在这一点上,我找不到任何解决方案,所以任何东西都会有帮助,谢谢。

编辑:最初函数返回了一个 int ,但它有一个更简单的解决方案,与代码的预期目的不兼容,函数已更改为请求泛型类型。

4

1 回答 1

5

isandas运算符仅针对编译器知道的类型(null可空值类型或引用类型)进行编译。

您可以尝试调用 IsAssignableFrom:

public int adaptiveFoo<T>()
{
  if (typeof(InterFoo<T>).IsAssignableFrom(typeof(T))
    return specialFoo<InterFoo>();
  return regularFoo<T>();
}

** 更新以反映问题的变化 **

不幸的是,类型约束是病毒式的,为了使您的方法能够编译(当与编译器进行严格的类型检查时),您还需要将约束添加到此方法中。然而,反射可以绕过这个限制:

你的方法是:

public InterFoo<T> adaptiveFoo<T>()
{
  if (typeof(InterFoo<T>).IsAssignableFrom(typeof(T))
  {
    var method = typeof (Class1).GetMethod("specialFoo");
    var genericMethod = method.MakeGenericMethod(typeof(T));
    return (Interfoo<T>)method.Invoke(this, null);
  }

  return regularFoo<T>();
}
于 2014-07-06T19:13:08.520 回答