【问题标题】:How to implement this code in c# 5.0如何在 c# 5.0 中实现此代码
【发布时间】:2012-09-27 17:42:26
【问题描述】:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test1
{
    public class NewGenerics<T> where T:new(int)
    {

    }
}

我如何正确编写这段代码,以便它与 C# 5.0 一起编译?

【问题讨论】:

  • 不可能,只支持new()
  • 你想完成什么?
  • @rkrahl:显然,OP 正在寻求一种放置通用约束的方法,该约束要求 T 具有一个采用 int 值的构造函数。
  • @O.R.Mapper - 也许你清楚。
  • @Oded:对不起,我通常都是为了详细而冗长的解释而不是纯粹的源代码,但是当new(),即new,调用构造函数的关键字和@ 987654326@,一个空参数列表,需要一个构造函数和一个空参数列表,修改为new(int),即new,调用构造函数的关键字,和(int),一个带有int 的参数列表,我认为如何解释这一点非常简单。其他任何东西,例如new-intnew[[int]],我不会认为它那么清楚;-)

标签: c# c#-5.0


【解决方案1】:

一种方法是作弊/解决方法,并使用 new() 和一个设置整数值的接口:

namespace Test1
{
    public class NewGenerics<T> where T: IMyInterface, new()
    {
         private static T Create(int theInteger)
         {
              var inst = new T();
              inst.SetTheInteger(theInteger);
              return inst;
         }


         ....
    }
}

您可以使用 Create 方法创建实例并使用整数或您需要的任何值初始化它们..

如果您可以强制所有类型都实现特定的接口......

【讨论】:

  • 在这种情况下,T 中的 int 字段不能声明为 readonly,但对于(仅)在构造函数中设置的值偶尔需要这样做。
  • 因此“作弊/解决方法”.. 无法创建此约束,因此所有解决方案都是解决方法..
  • 当然,只是认为在每种解决方法中指出缺点很重要,因此 OP 有更好的基础来做出决定。如果可以按照您的建议实现该接口,那么您的接口当然是一个很好的解决方案,甚至可以进行编译时检查。
【解决方案2】:

不幸的是,当前 C# 版本中受支持的通用约束集不允许指定除无参数构造函数之外的任何必需的构造函数签名。

实现此目的的唯一方法是使用反射进行运行时检查。您可以使用GetType() method 检索TType 实例,然后使用GetConstructors() 检索所有构造函数的ConstructorInfo 实例。使用这些,您可以检查 T 中的任何构造函数是否具有所需的签名,否则抛出异常......在您的 NewGenerics&lt;T&gt; 类的每个构造函数中。

这个解决方案的缺点是它只在运行时检查;它仍然会愉快地编译,并且只有在有人尝试创建您的类的实例时才抛出。

【讨论】:

    猜你喜欢
    • 2013-08-01
    • 2012-01-02
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多