如何向C#泛型传递一个值?

8
在C++中,模板具有的一个特性是您可以将值作为函数模板的参数传递。我如何在C#中实现相同的功能?
例如,我想要做类似于以下内容的操作:
template <unsigned n> struct Factorial {
     enum { 
        result = n * Factorial<n - 1>::result;
     };
};
template <> struct Factorial<0> {
      enum {
        result = 1;
      };
};

但是在C#中,我该如何做到这一点?

顺便说一下,我的实际需求涉及按需生成类(更改一些静态值),因此所呈现的代码只是一个示例。


这是否等同于通用方法?我对C++一无所知。 - Federico Berasategui
不,模板允许传递值,而泛型只允许传递类型。我正在寻找一种解决方法,以实现将值作为模板参数传递的相同效果,但在C#中(其中不允许这样做)。 - ludo
我不认为在面向对象的方法中这有什么用处。 - Federico Berasategui
1
你能更具体地说明你想要生成哪些类以及为什么吗? - Andrey Shchekin
可以通过 Emit 或 Code Dom(链接 http://stackoverflow.com/questions/7769287/c-sharp-reflection-how-to-emit-a-class)在 C#/.Net 中生成类... 但如果您指定实际问题(“例如克隆 Unity 接口拦截器”),可能会有其他方法。 - Alexei Levenkov
请提供一个接近您想要的样本,因为阶乘问题可能更适合使用记忆化技术来解决,或者类似的问题可以通过柯里化技术解决... - Alexei Levenkov
3个回答

6

C#中的泛型与C++中的模板不同。它们仅适用于类型而非值。


呵呵呵,我实际需要它们来动态生成类(更改一些静态值)。递归函数可以解决我给出的示例,但它并不能完全绕过泛型的限制。 - ludo
3
这句话的意思是:“我实际上需要它们来根据需求生成类(同时更改一些静态值),这是您真正的问题还是解决某个可以在C#中以不同方式解决的其他问题?” - Andrey Shchekin
@pretobomba,请详细说明您的具体问题。 - Daniel A. White
http://msdn.microsoft.com/en-us/library/c6cyy67b.aspx 是一个相当不错的解释。 - kentquirk
1
@DanielA.White 在C#中如何实现与在C++中向模板传递值相同的效果? - ludo
显示剩余6条评论

5
但是在 C# 中应该怎么做呢?

顺便说一下,我实际需要它们的原因是需要根据需求生成类(更改一些静态值),所以这里展示的代码只是一个例子。

正如Daniel解释的那样,这不可能通过泛型来实现。

一个潜在的替代方案是使用T4模板。根据您的需求,您可以在编译时基于模板生成类,这听起来可能符合您的需求。


-1

你正在试图让编译器执行那些应该在运行时由你的代码完成的任务。

在C++中,这是可能的。但在C#中不行。在C#中,相当于你的代码的写法是:

public class Factorial
{
    public static ulong Compute(ulong n)
    {
        if (n == 0)
            return 1;
        return n * Factorial.Compute(n - 1);
    }
}

请注意,虽然静态代码已经违反了OOP原则(但有时是必要的),但使用基于值的模板甚至更糟。您的类型应该依赖于其他类型,这可以使用泛型实现。它们不应该依赖于具体的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接