【问题标题】:how to pass multiple generic arguments如何传递多个泛型参数
【发布时间】:2011-07-29 02:44:51
【问题描述】:

我想知道是否有一种方法可以构建一个可以接受多个通用参数的类 编译时不知道的

   class Something<T,V,U> 

这个例子展示了一个类,它期望在运行时接收 3 个通用参数。 我正在寻找一种方法来指定一个除了不同数量的多个参数之外的类

类似的东西

    class Something<T[]> 

我以后可以使用反射来暴露它

  Type [] types = GetType().GetGenericArguments(); 

【问题讨论】:

  • 可变泛型参数?我不这么认为。
  • 使用泛型的主要目的是确保编译时的类型安全。如果您直到运行时才知道所涉及的泛型参数,那么您就没有尝试正确使用泛型。
  • 我从来没有像我建议的那样使用它们存在一个论点,它将为我省去一个混乱的解决方法的困难。感谢您无视这个概念。
  • 您是想创建一个包含所有层的单一类,还是要创建更像复合模式的东西?
  • 对不起,我不知道复合模式是什么

标签: c# .net generics reflection


【解决方案1】:

您不能指定 未知 数量的泛型。您可以获得的最接近的方法是定义所有可能的变化,或者至少定义您愿意处理的尽可能多的变化。我也建议使用抽象基类。例如:

public abstract class Something { }
public class Something<T1> : Something { }
public class Something<T1, T2> : Something { }
public class Something<T1, T2, T3> : Something { }
public class Something<T1, T2, T3, T4> : Something { }
public class Something<T1, T2, T3, T4, T5> : Something { }
...

当您需要引用类型但不知道泛型参数的数量时,抽象类很有用。

根据您的邪恶意图,您最终可能会使用此解决方案编写大量冗余代码,在这种情况下您应该重新考虑使用泛型。

【讨论】:

  • 谢谢我正在努力我想了一个解决方法,我使用反射得到我的 T 然后在Something我创建另一个Something使用Something 内部的反射,这可以做到如果我完成某事,我会在稍后发布我的答案。
【解决方案2】:

你可以做一些类——一种

public static class TypeHelper
{
    public static IEnumerable<Type> GetTypeCombination(this Type type)
    {
        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(T<,>))
            return type.GetGenericArguments().SelectMany(GetTypeCombination);

        return new Type[] { type };
    }
}

public class T<T1, T2>
{
    public static IEnumerable<Type> GetTypeCombination()
    {
        return typeof(T1).GetTypeCombination()
            .Concat(typeof(T2).GetTypeCombination());
    }
}

并将其用作

var list = T<int, T<string, int[]>>.GetTypeCombination().ToList();

获取(传递)类型的动态列表 - 不确定这是最好的方法

【讨论】:

  • 你不能传递泛型参数的变量计数,但你可以传递一个组合了几个(一对)它们的类型(这对的每个元素也可以是 2 的组合)跨度>
  • 谢谢,我需要尝试一下.. 它现在似乎在我的联盟之上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 2010-12-18
  • 2023-04-08
相关资源
最近更新 更多