【问题标题】:Conditional Logic to connect generic .Net method arguments连接通用 .Net 方法参数的条件逻辑
【发布时间】:2012-03-30 05:11:00
【问题描述】:

我有一个类似的 C# 方法:

private static IEnumerable<T2> SomeMethod<T1, T2>(IEnumerable<T1> arg1)
{

}

我希望能够做一些条件逻辑,这样如果 T1 是 A,那么 T2 是 B,依此类推。如果我只有这两个约束,这不是问题。但是,如果我还想要逻辑,比如如果 T1 是 C,那么 T2 是 D。

检查当然可以在方法中完成,但编译时检查会更好。 我想要的是在方法的通用 where 语句中指定这一点。

有没有办法在 C# 或任何其他 .net 语言中做到这一点?

更多信息 T1 基本上是一个数据对象,而 T2 是一个与 T1 数据对象相关的说明符。所有有效的 T1 都是某个基类,而所有有效的 T2 都是不同的基类。它们是两个不同的类,但总是一起使用。 我要避免的问题是代码数据和不同的说明符与一起传入的数据不符。

【问题讨论】:

  • 你能举出条件的例子吗? .NET 类型系统只允许在泛型类型参数上放置几个非常特殊的条件。
  • 你为什么要使用泛型来处理显然不是泛型的东西?下次你想敲钉子时,考虑用锤子代替反铲。 (Protip:泛型不是模板。如果您尝试像某种奇怪的字符串替换机制一样使用它们,那么您将进入一个 C++ 伤害的世界。)

标签: c# .net generics conditional


【解决方案1】:

听起来您想要的只是在 .NET 约束中无法表达。听起来你实际上可能使用简单的重载会更好......但我们真的知道得不够多。

如果一个方法只适用于几个类型参数 - 或几个类型参数的组合 - 那么它首先可能不适合成为一个泛型方法。

编辑:鉴于此信息,它可能更有意义:

更多信息 T1 基本上是一个数据对象,而 T2 是一个与 T1 数据对象相关的说明符。所有有效的 T1 都是某个基类,而所有有效的 T2 都是不同的基类。

这里的“说明符”不是很清楚你的意思,但听起来你可能希望 T2 用与 T1 相关的接口来表示。例如,如果这些是 *actually "entity" 和 "decorator-for-entity" 类型,您可能有:

private static IEnumerable<T2> SomeMethod<T1, T2>(IEnumerable<T1> arg1)
    where T2 : IDecorator<T1>

... 其中IDecorator&lt;T&gt; 是一个新接口。同样,仍然没有足够的信息可以说,但这种事情可能是一种有效的方法。

【讨论】:

  • @romkyns:不是真的:它用“否”的答案来回答“有没有办法做到这一点”的问题。
  • 我猜是“我们真的不知道说什么”这句话让我这么说。
  • 我添加了更多信息,但我相当肯定你是对的,因为这在 c# 语法中是不可能的。
  • @romkyns:我们不知道最好的替代方法是什么,但我可以说没有办法表达所要求的约束...
  • @nawfal 是的,我认为仅仅因为某人通常很好就直接拒绝质疑他们是一个坏主意。此外,自从第一次发表评论以来,这个答案已经扩大了很多。
猜你喜欢
  • 2010-09-06
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多