2016-08-02 231 views
0

我查过了(可能还不够),但找不到答案。C#:有没有办法将一个枚举作为参数传递?

我想做一个通用函数,我可以通过任何枚举来使用CheckedListBox(获取或设置值)。

public enum TypeFlags 
{ 
    None = 0x0, 
    //List of flag 
} 

private void makeFlagOrBitmask(CheckedListBox list, Type e) 
{ 
    int myFlags = 0x0; 

    //I want to achieve something like that 
    foreach (Object item in list.CheckedItems) 
    { 
     //(TypeFlags)Enum.Parse(typeof(TypeFlags), item); 
     //So e should be the enum himself, but i can't figure how to do that 
     myFlags += (int)((e)Enum.Parse(typeof(e), item.tostring())); 
    } 
} 

所以,我可以使用一个函数来制作/读取任何标志。

问题是,我不知道如何通过枚举,因为我需要在函数中。

+0

出了什么问题? – MasterXD

+0

删除typeof(e)并离开Enum.Parse(e ...因为e已经是一个类型了吗? – Andez

+0

'typeof(e)'当'e'是'Type'就是给你'Type'的类型对象,而不是枚举类型,你只需要将'e'传递给'Enum.Parse'。 – juharr

回答

-1

你想改变这一行:

myFlags += (int)((e)Enum.Parse(typeof(e), item.tostring())); 

进入这个:

myFlags += (int)((e)Enum.Parse(e, item.tostring())); 

由于e已经是一个类型。至于如何通过参数:

makeFlagOrBitmask(myCheckBoxList, typeof(myEnum)); 

我希望这有助于。

编辑:

为了确保只有枚举将工作,将它添加到您的函数的顶部:

if (!e.IsEnum) 
    return; 
+0

这允许你传递非枚举类型。 – Servy

+0

这就是我所需要的,就像我上面所说的那样。谢谢 ! –

+0

@SiveurWesttunger太好了,我做了一个编辑,所以检查一下。另外,你能接受我的答案吗?那简直太好了。谢谢。 – MasterXD

0

可能是不完整的,但它听起来像你需要一个通用的枚举迭代器。我从Create Generic method constraining T to an Enum

public T GetEnumFromString<T>(string value) where T : struct, IConvertible 
{ 
    if (!typeof(T).IsEnum) 
    { 
     throw new ArgumentException("T must be an enumerated type"); 
    } 

    //... 
} 
0

我知道这是不是一个很好的代码拿起下面的代码,但是这个工作对我来说:

如果该方法需要一个对象,而不是一个类型(也许你可以做到这一点一种类型)你可以这样做:

if (e.GetType() == typeof(ImageType)) 
    { 
     ValueArray = GetEnumArray(ImageType.Bmg); 
    } 

这样你可以检查什么枚举它在你做某事之前。

我希望这可以帮助你。

相关问题