泛型方法,并将任何枚举作为参数传递

本文关键字:参数传递 枚举 任何 泛型方法 | 更新日期: 2023-09-27 18:21:45

全部,

我正在尝试在Enum框架中整理我的最后几点。

我的目标:我想发送任何枚举类型,并将其转换为列表,然后将其绑定到下拉列表。我将使用ObjectDataSource作为给定下拉列表的DataSource。我想创建一个只接受一个参数的复合控件;枚举类型。复合控件将对数据绑定和所有其他位和bop进行排序。

现在,我遇到的唯一问题是将泛型方法转换为与ObjectDataSource兼容。

以下是我当前需要在ObjectDataSource上使用的方法的代码。因此,此方法运行良好,并返回枚举类型WeekDays的项目列表。然而,我需要相同的功能,但我需要用任何类型的枚举替换WeekDays。

代码:

public class DropDownData
{
    public EnumDataItemList GetList()
    {
        EnumDataItemList items = new EnumDataItemList();
        foreach (int value in Enum.GetValues(WeekDays))
        {
            EnumDataItem item = new EnumDataItem();
            WeekDays d = (WeekDays)value;
            //Set display text
            if (!string.IsNullOrEmpty(DataHandlers.GetAttributeValue<DisplayTextAttribute, string>(d)))
            {
                //Translation logic goes here
                item.Text = DataHandlers.GetAttributeValue<DisplayTextAttribute, string>(d);
            }
            else
            {
                //Translation logic goes here
                item.Text = Enum.GetName(typeof(WeekDays), value);  
            }
            item.Value = value; //Actual value
            item.ToolTip = DataHandlers.GetAttributeValue<ToolTipAttribute, string>(d);
            item.Description = DataHandlers.GetAttributeValue<Lia.Library.Enums.CustomAttributes.DescriptionAttribute, string>(d);
            item.HelpText = DataHandlers.GetAttributeValue<HelpTextAttribute, string>(d);
            item.ExcludeOnBinding = DataHandlers.GetAttributeValue<ExcludeOnBinding, bool>(d);
            if (!item.ExcludeOnBinding)
            {
                items.Add(item);                    
            }
        }
        return items;
    }
}
public class EnumDataItemList : List<EnumDataItem>
{
}

据我所知,我不能将泛型方法与ObjectDataOurce一起使用,但泛型类是可以的。我只是无法让它与泛型类一起工作,我们非常感谢所有的帮助。当一切正常时,我很乐意分享完整的解决方案。

我使用的是Framework 2.0。

泛型方法,并将任何枚举作为参数传递

这应该会对您有所帮助。(如果T不是枚举类型,将引发异常。)

public static EnumDataItemList GetList<T>() where T : struct
{
    EnumDataItemList items = new EnumDataItemList();
    foreach (int e in Enum.GetValues(typeof(T)))
    {
       EnumDataItem item = new EnumDataItem();
       item.Text = Enum.GetName(typeof(T), e);
       item.Value = e;
    }
  //Rest of code goes here
}

用法:

EnumDataItemList days = GetList<WeekDays>();

如果您不想使用通用方法,可以将其更改为:

public static EnumDataItemList GetList(Type t)
{
        EnumDataItemList items = new EnumDataItemList();
        foreach (int e in Enum.GetValues(t))
        {
           EnumDataItem item = new EnumDataItem();
           item.Text = Enum.GetName(t, e);
           item.Value = e;
        }
      //Rest of code goes here
}

Magnus的替代方案,但想法几乎完全相同(只是不想在被击败后将其抛出;-))-只是在枚举值上迭代,而不是int。相同用法:

public static class DropDownData
{
    // struct, IComparable, IFormattable, IConvertible is as close as we'll 
    // get to an Enum constraint. We don't actually use the constraint for 
    // anything except rudimentary compile-time type checking, though, so 
    // you may leave them out.
    public static EnumDataItemList GetList<T>() 
            where T : struct, IComparable, IFormattable, IConvertible
    {
        // Just to make the intent explicit. Enum.GetValues will do the
        // type check, if this is left out:
        if (!typeof(T).IsEnum)
        {
            throw new ArgumentException("Type must be an enumeration");
        }
        EnumDataItemList items = new EnumDataItemList();
        foreach (Enum e in Enum.GetValues(typeof(T)))
        {
            EnumDataItem items = new EnumDataItem();
            // Note: This assumes the enum's underlying type is
            // assignable to Int32 (for example, not a long):
            int value = Convert.ToInt32(e);
            // The same attribute retrieval code as in the 
            // WeekDays example, including:
            item.Text = e.ToString(); // e is Enum here, no need for GetName
        }
    }
}

我似乎对这个问题有点不同,并提出了一些似乎对我有用的非常简洁的东西。我不能声称这是原创作品,因为我不记得我是否找到了它并复制了它,或者我是否将它与我自己的一些原创作品拼凑在一起。我在枚举上放了一个扩展方法,它为我提供了一个ToDisplayText函数,用于获取我的同名自定义枚举属性。

    this.ddlBlah.DataSource =
      Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>()
      .ToDictionary(x => x, x => x.ToDisplayText());
    this.ddlBlahs.DataValueField = "key";
    this.ddlBlah.DataTextField = "value";
    this.ddlBlah.DataBind();

public static string ToDisplayText(this Enum Value)
{
  try
  {
    Type type = Value.GetType();
    MemberInfo[] memInfo = type.GetMember(Value.ToString());
    if (memInfo != null && memInfo.Length > 0)
    {
      object[] attrs = memInfo[0].GetCustomAttributes(
                                    typeof(DisplayText),
                                    false);
      if (attrs != null && attrs.Length > 0)
        return ((DisplayText)attrs[0]).DisplayedText;
    }
  }
  catch (Exception ex)
  {
    throw new Exception("Your favorite error handling here");
  }
  return Value.ToString();
  // End of ToDisplayText()
}

[System.AttributeUsage(System.AttributeTargets.Field)]
public class DisplayText : System.Attribute
{
  public string DisplayedText;
  public DisplayText(string displayText)
  {
    DisplayedText = displayText;
  }
  // End of DisplayText class definition
}