Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Silverlight中迭代枚举?_Silverlight - Fatal编程技术网

在Silverlight中迭代枚举?

在Silverlight中迭代枚举?,silverlight,Silverlight,在.Net中,可以使用 System.Enum.GetNames(typeof(MyEnum)) 或 但是,在Silverlight 3中,未定义Enum.GetNames和Enum.getValue。有人知道替代方案吗?我没有尝试过,但是反射API应该可以工作。我相信这与.NET Compact Framework中的相同。如果我们假设枚举值从0开始,并使用每个值直到其范围超过以下值,那么下面的代码应该可以工作 public static IList<int> GetEnumV

在.Net中,可以使用

System.Enum.GetNames(typeof(MyEnum)) 


但是,在Silverlight 3中,未定义Enum.GetNames和Enum.getValue。有人知道替代方案吗?

我没有尝试过,但是反射API应该可以工作。

我相信这与.NET Compact Framework中的相同。如果我们假设枚举值从0开始,并使用每个值直到其范围超过以下值,那么下面的代码应该可以工作

public static IList<int> GetEnumValues(Type oEnumType)
{
  int iLoop = 0;
  bool bDefined = true;
  List<int> oList = new List<int>();

  //Loop values
  do
  {
    //Check if the value is defined
    if (Enum.IsDefined(oEnumType, iLoop))
    {
      //Add item to the value list and increment
      oList.Add(iLoop);
      ++iLoop;
    }
    else
    {
      //Set undefined
      bDefined = false;
    }
  } while (bDefined);

  //Return the list
  return oList;
}
公共静态IList GetEnumValues(类型oEnumType)
{
int-iLoop=0;
bool-bDefined=true;
List oList=新列表();
//循环值
做
{
//检查是否定义了该值
if(枚举已定义(oEnumType,iLoop))
{
//将项添加到值列表并递增
oList.Add(iLoop);
++伊洛普;
}
其他的
{
//未定义集
b定义=假;
}
}而(b)罚款;;
//返回列表
回归寡头;
}
显然,您可以调整代码以返回枚举名称或匹配不同的模式,例如按位值

下面是该方法的另一个版本,它返回一个
IList

公共静态IList GetEnumValues()
{
雌蕊型;
int-iLoop=0;
bool-bDefined=true;
List oList=新列表();
//获取枚举类型
oEnumType=类型(T);
//检查我们是否有一个枚举
if(oEnumType.IsEnum)
{
//循环值
做
{
//检查是否定义了该值
if(枚举已定义(oEnumType,iLoop))
{
//将项添加到值列表并递增
添加((T)(对象)iLoop);
++伊洛普;
}
其他的
{
//未定义集
b定义=假;
}
}而(b)罚款;;
}
//返回列表
回归寡头;
}

我模仿.Net中的函数,在不假设枚举的情况下,找到了如何做到这一点:

public static string[] GetNames(this Enum e) {
    List<string> enumNames = new List<string>();

    foreach (FieldInfo fi in e.GetType().GetFields(BindingFlags.Static | BindingFlags.Public)){
        enumNames.Add(fi.Name);
    }

    return enumNames.ToArray<string>();
}

public static Array GetValues(this Enum e) {
    List<int> enumValues = new List<int>();

    foreach (FieldInfo fi in e.GetType().GetFields(BindingFlags.Static | BindingFlags.Public)) {
        enumValues.Add((int)Enum.Parse(e.GetType(), fi.Name, false));
    }

    return enumValues.ToArray();
}
public静态字符串[]GetNames(此枚举e){
List enumNames=新列表();
foreach(e.GetType().GetFields(BindingFlags.Static | BindingFlags.Public)中的FieldInfo fi){
enumNames.Add(fi.Name);
}
返回enumNames.ToArray();
}
公共静态数组GetValues(此枚举e){
列表枚举值=新列表();
foreach(e.GetType().GetFields(BindingFlags.Static | BindingFlags.Public)中的FieldInfo fi){
Add((int)Enum.Parse(e.GetType(),fi.Name,false));
}
返回enumValues.ToArray();
}

或者可以使用linq强类型,如下所示:

    public static T[] GetEnumValues<T>()
    {
        var type = typeof(T);
        if (!type.IsEnum)
            throw new ArgumentException("Type '" + type.Name + "' is not an enum");

        return (
          from field in type.GetFields(BindingFlags.Public | BindingFlags.Static)
          where field.IsLiteral
          select (T)field.GetValue(null)
        ).ToArray();
    }

    public static string[] GetEnumStrings<T>()
    {
        var type = typeof(T);
        if (!type.IsEnum)
            throw new ArgumentException("Type '" + type.Name + "' is not an enum");

        return (
          from field in type.GetFields(BindingFlags.Public | BindingFlags.Static)
          where field.IsLiteral
          select field.Name
        ).ToArray();
    }
publicstatict[]GetEnumValues()
{
var类型=类型(T);
如果(!type.IsEnum)
抛出新的ArgumentException(“Type'”+Type.Name+“'不是枚举”);
返回(
从type.GetFields中的字段(BindingFlags.Public | BindingFlags.Static)
where field.IsLiteral
选择(T)字段。获取值(null)
).ToArray();
}
公共静态字符串[]GetEnumStrings()
{
var类型=类型(T);
如果(!type.IsEnum)
抛出新的ArgumentException(“Type'”+Type.Name+“'不是枚举”);
返回(
从type.GetFields中的字段(BindingFlags.Public | BindingFlags.Static)
where field.IsLiteral
选择字段名
).ToArray();
}

但是,我建议您为顶部方法返回一个IList,为第二个方法返回一个IList。请记住,这将不支持表示长值的枚举。您可以通过获取基础类型(Enum.getunderyingtype())来支持非int类型。此解决方案还有一些不足之处。用法语法要求您提供枚举类型的实例,而原始.net方法允许您直接处理枚举类型。在这方面,我发现@ptoinson的答案更好。它的语法简单明了。GetEnumValues()我知道您有假设连续值的警告,但特别是任何[Flags]属性的枚举都不起作用。@dcstrow-读最后一句话,我承认您可以使用不同的模式来匹配位值,例如[Flags];要做到这一点,
++iLoop将变成
iLoop=iLoop请求:因为它不返回特定枚举类型的数组,而是一个列表,所以它实际上与.NET平台上的行为不匹配,并且在尝试确定此函数是否适用于其他用户时,给我造成了很大的混乱。你愿意把它改名成别的名字吗?我的主要问题是GetArrayValues(i).ToString()返回一个数字字符串,而不是实际.NET版本返回的枚举名,尽管我确信还有其他可能引起混淆的原因。@shelleybutterfly-为什么不使用
((EnumType)GetArrayValues[i])。ToString()
或在VB.NET
CType中(GetArrayValues(i),EnumType).ToString()
?我的回答是,上面的代码只是一个简单的示例,可以很容易地重新编写以返回不同的类型或匹配不同的枚举模式。因为在提问者的情况下,枚举类型事先不知道;只给出了
type CurrentEnumType;
。我同意您在在后续的文本中,它只是让我感到困惑(我不熟悉正常的返回值;一个包含任何枚举类型的数组)因为我假设同名意味着它返回与标准.NET framework方法相同的内容。框架中没有这样的内容是荒谬的。下载大小不是折磨开发人员的借口。如果有人需要,特别是GetEnumValues()和GetEnumNames();我已经实现了它们(基于下面ptoinson和Shimmy的回答)作为对以下问题的回答:,我认为它们与同名的常规(但非Silverlight).NET函数等价。最好在方法定义中放置
其中T:struct,IConvertible
,以获得
public static string[] GetNames(this Enum e) {
    List<string> enumNames = new List<string>();

    foreach (FieldInfo fi in e.GetType().GetFields(BindingFlags.Static | BindingFlags.Public)){
        enumNames.Add(fi.Name);
    }

    return enumNames.ToArray<string>();
}

public static Array GetValues(this Enum e) {
    List<int> enumValues = new List<int>();

    foreach (FieldInfo fi in e.GetType().GetFields(BindingFlags.Static | BindingFlags.Public)) {
        enumValues.Add((int)Enum.Parse(e.GetType(), fi.Name, false));
    }

    return enumValues.ToArray();
}
    public static T[] GetEnumValues<T>()
    {
        var type = typeof(T);
        if (!type.IsEnum)
            throw new ArgumentException("Type '" + type.Name + "' is not an enum");

        return (
          from field in type.GetFields(BindingFlags.Public | BindingFlags.Static)
          where field.IsLiteral
          select (T)field.GetValue(null)
        ).ToArray();
    }

    public static string[] GetEnumStrings<T>()
    {
        var type = typeof(T);
        if (!type.IsEnum)
            throw new ArgumentException("Type '" + type.Name + "' is not an enum");

        return (
          from field in type.GetFields(BindingFlags.Public | BindingFlags.Static)
          where field.IsLiteral
          select field.Name
        ).ToArray();
    }