【问题标题】:How do I pass a generic type parameter to a method called from a constructor?如何将泛型类型参数传递给从构造函数调用的方法?
【发布时间】:2013-03-03 22:49:40
【问题描述】:

这里是构造函数:

 public PartyRoleRelationship(PartyRole firstRole, PartyRole secondRole)
        {
            if (firstRole == secondRole)
                throw new Exception("PartyRoleRelationship cannot relate a single role to itself.");

            if (firstRole.OccupiedBy == null || secondRole.OccupiedBy == null)
                throw new Exception("One or both of the PartyRole parameters is not occupied by a party.");

            // Connect this relationship with the two roles.
            _FirstRole = firstRole;
            _SecondRole = secondRole;


            T = _FirstRole.GetType().MakeGenericType();

            _SecondRole.ProvisionRelationship<T>(_FirstRole); // Connect second role to this relationship.
        }

在最后一行,它在 _SecondRole 上调用 ProvisionRelationship,它给了我运行时错误:找不到类型或命名空间“T”...

我如何 (a) 正确分配 T,或 (b) 使用构造函数传递泛型类型?我一直在浏览很多帖子,但可能由于缺乏理解而错过了一些东西。任何人对此的帮助将不胜感激。

【问题讨论】:

标签: c# generics constructor


【解决方案1】:

你的类需要是通用的。所以PartyRoleRelationship 需要看起来像这样:

public class PartyRoleRelationship<T>
{
    public PartyRoleRelationship(T arg, ...)
    {
    }
}

在此处阅读有关泛型类的更多信息:

http://msdn.microsoft.com/en-us/library/sz6zd40f(v=vs.80).aspx

http://msdn.microsoft.com/en-us/library/ms379564(v=vs.80).aspx

编辑:

你可以稍微简化一下你的代码,然后这样做:

public class RoleRelationship<T>
{
    public RoleRelationship(T firstRole, T secondRole)
    {
        if (firstRole.OccupiedBy == null || secondRole.OccupiedBy == null)
            throw new Exception("One or both of the Role parameters is not occupied by a party.");

        // Connect this relationship with the two roles.
        _FirstRole = firstRole;
        _SecondRole = secondRole;

        _SecondRole.ProvisionRelationship<T>(_FirstRole);
    }
}

【讨论】:

  • 我认为您需要更好地限定泛型 T,否则您可以将 double、string、int、object 传递给构造函数,它不会按预期工作。
  • 是的,这将是一个非常好的主意。 Phil,也请看一下 Moop 的答案,它显示了如何指定 T 实际上是什么。
  • 有没有办法在构造函数中定义 T,而不是将泛型类型参数传递给构造函数?就像,从 _SecondRole 中提取类型并将其传递给 ProvisionRelationship
  • 无法创建泛型类构造函数,请在此处查看 Jon Skeets 答案:stackoverflow.com/a/700986/368379
【解决方案2】:

创建一个泛型类,其中泛型类型 T 是基类 PartyRole 的类型:

public class PartyRoleRelationship<T> where T : PartyRole 
{
     T _FirstRole;
     T _SecondRole;

     public PartyRoleRelationship(T role1, T role2) {
         _FirstRole = role1;
         _SecondRole = role2;
         role1.ProvisionRelationship(role2)
     }

     public ProvisionRelationship(T otherRole) {
          // Do whatever you want here
     }

}

【讨论】:

    【解决方案3】:

    如果您静态知道 _FirstRole 的类型(是 PartyRole 吗?),您可以使用它:

    _SecondRole.ProvisionRelationship<PartyRole>(_FirstRole);
    

    【讨论】:

    • 我没有。 PartyRole 是基类,但它传递的是 PartyRole 的派生类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多