【问题标题】:A generic type as a parameter泛型类型作为参数
【发布时间】:2009-11-26 16:35:56
【问题描述】:

我的第一个问题是,是否可以将泛型类型指定为参数, 其次,下面列出的伪代码之类的东西可能吗?

我假设它将使用 .net 4.0 和动态修改器,但我对 4.0 之前的解决方案更感兴趣。

    public static void SomeMethod(List<T> l, Type type, Control samplecontrol)
    {
     l.Add((type)samplecontrol);
    }

编辑:

这是我的解决方案...

    public static void FindControlRecursive<T>(Control parent, List<T> l)
    {
        foreach (var ctrl in parent.Controls)
        {
            if (ctrl.GetType() == typeof(T))
                l.Add((T)ctrl);
            if (((Control)ctrl).Controls != null && ((Control)ctrl).Controls.Count > 0)
                foreach (Control _ctrl in ((Control)ctrl).Controls)
                    FindControlRecursive<T>(_ctrl, l);
        }
    }

【问题讨论】:

  • 看看这个比较:ctrl.GetType() == typeof(T) - 你确定这是你真正想要的吗?如果你通过例如ButtonBaseT 不匹配,它不会匹配 ButtonCheckBox(它们都派生自 ButtonBase)。也许你想要ctrl is T 代替?此外,如果您写的是foreach (Control ctrl ...) 而不是foreach (var ctrol ...),则不需要Add((T)ctrl) 和所有(Control)ctrl 中的演员 - 后者的问题是Controls 集合不是通用的,所以@987654335 @ 推断为object.

标签: c# asp.net list generics


【解决方案1】:

你是说这个吗?

public static void SomeMethod<T>(List<T> l, T item)
{
    l.Add(item);
}

【讨论】:

    【解决方案2】:

    您需要在方法名称中添加修改的泛型类型。这将替换您尝试传入的类型参数,

    public static Add<T>(List<T> l, T samplecontrol)
    {
     l.Add(samplecontrol);
    }
    

    您还可以在方法中添加类型限定符

    public static Add<T>(List<T> l, T samplecontrol) 
        where T : Control
    {
     l.Add(samplecontrol);
    }
    

    【讨论】:

      【解决方案3】:

      试试这个

      public static void YourMethodName<T>(List<T> l, Control samplecontrol)
      {
          l.Add((T)samplecontrol);
      }
      

      【讨论】:

        【解决方案4】:

        是的,这是可能的,并且从 C# 2.0 开始就一直如此。这可能是您正在寻找的语法:

        public static void AddControlToList<T>(List<T> list, Control sampleControl)
        {
            list.Add((T)sampleControl)
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-09-28
          • 1970-01-01
          • 1970-01-01
          • 2018-05-18
          • 2016-11-14
          • 1970-01-01
          • 1970-01-01
          • 2019-03-05
          相关资源
          最近更新 更多