C# 具有自动命名属性的通用组合框

C# 具有自动命名属性的通用组合框,c#,generics,.net-3.5,user-controls,C#,Generics,.net 3.5,User Controls,我正在为WinForms ComboBox控件编写一个包装器,它将让我用一个列表填充下拉列表,并具有一个Selected属性,该属性返回一个T类型的项(如果没有选择,则返回null) 我希望它自动基于泛型类型命名,而不是具有选定的属性。例如: MyDropDownList将具有SelectedUser属性 MyDropDownList将具有SelectedDepartment属性 MyDropDownList将具有SelectedState属性 使用LINQ,我可以在分组期间创建匿名类型,如

我正在为WinForms ComboBox控件编写一个包装器,它将让我用一个列表填充下拉列表,并具有一个Selected属性,该属性返回一个T类型的项(如果没有选择,则返回null)

我希望它自动基于泛型类型命名,而不是具有选定的属性。例如:

  • MyDropDownList将具有SelectedUser属性
  • MyDropDownList将具有SelectedDepartment属性
  • MyDropDownList将具有SelectedState属性
使用LINQ,我可以在分组期间创建匿名类型,如下所示:

var usersByGender = users
    .GroupBy(x => x.Gender)
    .Select(group => new {Gender = group.Key, List = group.ToList()});
这将导致生成一个包含性别属性的匿名类型列表,以及IntelliSense可检测的列表。问题是,我是否可以在泛型类中使用属性来实现这一点


编辑:我现在意识到我本质上是在要求C#3.0中的“method_missing”,这可能是不可能的。不过,我愿意接受建议。

不,你不能那样做。泛型类型背后的全部思想是它们平等地应用于可以在泛型参数中指定的所有类型。如果每个专门化都允许声明不同名称的成员,情况就不会如此。

我认为你做不到。唯一有可能工作的方法是创建某种工厂方法来创建类型并返回它。基本上,泛型类型成为基类,IL是动态编写的,创建一个从泛型继承但添加了新属性的具体类。当然,返回的对象实际上是匿名的,您只能通过反射来访问它,因为您没有实际转换到的类型:

public static class CrazyFactory
{
     public static object CreateTypedComboList<T>()
     {
          //magic happens
          return object;
     }
}

我一直在关注,自己还没有接触过dynamics,但它确实看起来像你想要的是可能的。尽管如此,我仍然不会这样做-您将无法获得Intellisense,而且它似乎是一种脆弱而复杂的定义功能的方法。

是否希望在运行时生成一个选定的属性调用名称,以下拉列表中的项类命名?或者您希望它在设计时更改吗?它当前在设计时隐藏,但我希望能够通过代码访问它。我目前只使用“Selected”属性的解决方案工作得很好,我只是认为如果代码是“Selected”+typeof(T).Name,那么代码会更容易阅读
object userCombo = CrazyFactory.CreateTypedComboList<User>();
PropertyInfo selectedUserProperty = userCombo.GetType().GetProperty("SelectedUser");
selectedUserProperty.SetValue(userCombo, user);
public override MetaObject GetMember(GetMemberAction action, MetaObject[] args)
{
     //not sure on the real property name here...
     string actionName = action.Name;

     if (actionName = "Selected" + typeof(T).Name)
     {
          return SelectedItem; //in some MetaObject wrapper 
     }
}