如何调用Method <t>泛型

时间:2018-07-26 16:15:11

标签: c# .net list

我在调用通用方法时遇到了问题,我已经搜索了很多,却没有找到解决方案,这是我的错误。 而且我不知道自己做得不好,

  

无法从用法中推断出方法'FormGasolineUserControl.loadList (list ,string)'的类型参数。尝试指定类型自变量。

这是我的代码:

我在其中获得错误的这段代码

private void loadDataForm()
{
    try
    {               
        DateTime dateNow = DateTime.Now;    
        // Call Services WPF
        var QueryBD = services.LoadDataFormGasoline(1, (int)ETax.Gasoline);     
        if (QueryBD.Company != null)
        {
            day.Value = dateNow.Day.ToString();
            month.Value = dateNow.Month.ToString();
            year.Value = dateNow.Year.ToString();
            anioGravable.Value = dateNow.Year.ToString();
            peridoGravable.Value = PeriodoGravable(dateNow).ToString(); 

            //Error call Method
            loadList( QueryBD.QualityDeclarate, QualityDeclarate.Name.ToString()); 
            loadList( QueryBD.TypeDeclarate, TypeDeclarate.Name.ToString());            
        }
    }
    catch (Exception)
    {

        throw;
    }

}

这就是方法:

public void loadlist<T>(List<T> lista,string nameControl)
{           
    try
    {       
        switch (nameControl)
        {  
            case "TypeDeclarate":
                TypeDeclarate.Items.Add(new ListItem("Select..."));
                foreach (var name in lista)
                {
                    TypeDeclarate.Items.Add(new ListItem(name.ToString()));
                }
            break;
            case "QualityDeclarate":
                QualityDeclarate.Items.Add(new ListItem("Select..."));
                foreach (var name in lista)
                {
                    QualityDeclarate.Items.Add(new ListItem(name.ToString()));
                }
            break;                   
        }

    }
    catch (Exception)
    {

        throw;
    }
} 

我的主要目的是能够通过数据库中查询的列表来加载用户控件的动态设置。 帮助我...

2 个答案:

答案 0 :(得分:4)

可以通过很多方式改进此代码。

  • 它不应该是通用的。
  • 可以将其重构为更清晰的较小方法。
  • 命名约定不遵循C#约定。
  • 它需要一个列表,但只枚举元素
  • 它确实适用于字符串序列。
  • try-catch没有用。

我们修复它。

private void AddItemsToCollection(IEnumerable<string> names, IList<ListItem> items) 
{
  items.Add(new ListItem("Select..."));
  foreach (var name in names)
    items.Add(new ListItem(name));
}

看到这有多简单? 使简单的方法做好一件事情。现在,我们使用该助手来创建其他简单的方法:

private void AddItemsToCollection(IEnumerable names, IList<ListItem> items) 
{
  AddItemsToCollection(names.Cast<object>().Select(n => n.ToString(), items);
}

再次,超级简单。一条线。让我们做更多的单线:

public void AddTypeDeclarateItems(IEnumerable names)
{
  AddItemsToCollection(names, TypeDeclarate.Items);
}

很容易。再做一次。

public void AddQualityDeclarateItems(IEnumerable names)
{
  AddItemsToCollection(names, QualityDeclarate.Items);
}

现在我们的方法很简单:

public void AddItemsToCollection(IEnumerable names, string control)
{           
  switch (control)
  {  
    case "TypeDeclarate":
      AddTypeDeclarateItems(names);
      break;
    case "QualityDeclarate":
      AddQualityDeclarateItems(names);
      break;
  }
}

如果您简化代码,以使每种方法都可以做到一件事情,那么您的代码将变得更易于理解,更易于纠正和调试。

替代解决方案:将开关移到帮助器中:

IList<ListItem> GetItems(string control)
{
  switch (control)
  {  
    case "TypeDeclarate":
      return TypeDeclarate.Items;
    case "QualityDeclarate":
      return QualityDeclarate.Items;       
  }
  throw new SomeException(...);
}

现在我们的方法是:

public void AddItemsToCollection(IEnumerable names, string control)
{           
  AddItemsToCollection(names, GetItems(control));
}

再次,看看让每种方法都做一件事情会发生什么?每种方法都很容易理解,而且很可能是正确的。

答案 1 :(得分:2)

这是调用此方法的正确方法:

<p><span class="colorL"><ruby>三重県<rt>みえけん</rt></ruby></span>の<span class="colorL"><ruby>伊賀市<rt>いがし</rt></ruby></span>は、<a class="dicWin" href="javascript:void(0)" id="id-0000"><ruby><span class="under">忍者</span><rt>にんじゃ</rt></ruby></a>の<a class="dicWin" href="javascript:void(0)" id="id-0001"><span class="under">ふるさと</span></a>だと<ruby>言<rt>い</rt></ruby>われています。</p>

但是,我想也许问题出在包含方法的类内部 ... loadlist<string>(QueryBD.myListOfStrings, "nameControl"); loadlist<int>(QueryBD.myListOfInts,"nameControl"); ...

提出这个问题:什么是T?我的意思是,在类声明中,我们有很多可能性。

我们可以像设置类一样设置T参数:void loadlist<T>(List<T> lista,string nameControl); 结构:public MyClass<T> where T : class;具有公共构造函数public MyClass<T> where T : struct,...

的类

查看所有可能性:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters

因此,让我们想象一下T是一个必须实现接口的类,而您传递的是一个没有实现该接口的类,那么您就不会成功。