首页 > 解决方案 > 访问泛型方法中的字段

问题描述

我正在用 C# 编写我的第一个泛型类。一般来说,我正在这样做

switch (allValidatedCombo[i].Name.ToString())
{
     case "senderComboBox":
           senderComboBox.SelectedIndex = senderComboBox.FindString(senderComboBox.Text);
           List<Provider> allProviders = senderComboBox.DataSource as List<Provider>;
           var item1 = allProviders.Where(x => x.Id == (short)senderComboBox.SelectedValue).SingleOrDefault();
           criteria = " SenderId ='" + item1.Id + "' and "; 
           break;
     case "receiverComboBox":
          receiverComboBox.SelectedIndex = receiverComboBox.FindString(receiverComboBox.Text);
          List<Provider> allProviders1 = receiverComboBox.DataSource as List<Provider>;
          var item2 = allProviders1.Where(x => x.Id == (short)receiverComboBox.SelectedValue).SingleOrDefault();
          criteria = " RecipientId ='" + item2.Id + "' and ";
     break;
     case "signedByComboBox":
          signedByComboBox.SelectedIndex = signedByComboBox.FindString(signedByComboBox.Text);
          List<User> allUsers1 = receiverComboBox.DataSource as List<User>;
          var item3 = allUsers1.Where(x => x.Id == (short)receiverComboBox.SelectedValue).SingleOrDefault();
          criteria = " SignedById ='" + item3.Id + "' and ";
     break;
     case "registeredByComboBox":
          registeredByComboBox.SelectedIndex = registeredByComboBox.FindString(registeredByComboBox.Text);
          List<User> allUsers2 = registeredByComboBox.DataSource as List<User>;
          var item4 = allUsers2.Where(x => x.Id == (short)receiverComboBox.SelectedValue).SingleOrDefault();
          criteria = " CreatedById ='" + item4.Id + "' and ";
      break;
 }

所以我决定让它通用。我做了这个

public class HelperGeneric<T>
{
    public List<T> genericProperty { get; set; }
    public short genericSelectedvalue { get; set; }

    public void Method<T>(T input)
    {  
        genericProperty.Where(x => x.Id == genericSelectedvalue).SingleOrDefault();
    }
}

这就是我所说的:

 HelperGeneric<Provider> helper = new HelperGeneric<Provider>();
 helper.genericProperty = senderComboBox.DataSource as List<Provider>;
 helper.genericSelectedvalue = (short)senderComboBox.SelectedValue;
 helper.Method(senderComboBox.DataSource as List<Provider>);

但是在方法的LINQ中

public void Method<T>(T input)
{  
    return genericProperty.Where(x => x.Id == genericSelectedvalue).SingleOrDefault();
}

我无法访问x.Id。如何返回记录并为其设置条件

标签: c#.netgenerics

解决方案


您可以定义一个interfacewith one property

public interface IContainId
{
    int Id { get; set; }
}

然后你的泛型类和Provider类应该实现这个接口,如下所示:

public class HelperGeneric<T> where T : class , IContainId

public class Provider : IContainId

那么以下应该可以正常工作:

genericProperty.Where(x => x.Id == genericSelectedvalue)

推荐阅读