如何动态获取ImageFormat属性之一(如ImageFormat.Png或ImageFormat.Jpeg)?

时间:2015-10-07 00:08:12

标签: c# reflection lambda

你能帮我解决一些问题吗?

我想获得一个ImageFormat属性(如ImageFormat.Png或ImageFormat.Jpeg等)。我动态地需要它。 该方法看起来应该像我看到的那样:

private List<ImageFormat> GetValidImageFormats()
    {
        List<ImageFormat> result = new List<ImageFormat>()
        foreach (string extension in ValidExtensions)
        {
            // do some expression magic
        }
    }

我在使用foreach中的代码时遇到问题。我甚至不确定使用Expression Trees

我需要它用于上传图像文件的自定义验证器。任何帮助都很棒。任何相关解决方案都是+1。

编辑: ValidExtensions = new[] {"jpg", "png", "jpeg", "bmp", "gif", "icon"}

的可能值

1 个答案:

答案 0 :(得分:2)

只要您的扩展程序列表符合ImageFormat类返回的内容,就像这样:

private List<string> ValidExtensions = new List<string> {"bmp", "jpeg", "png"};

您可以使用反射将每个字符串转换为等效的ImageFormat

private List<ImageFormat> GetValidImageFormats()
{
    var t = typeof(ImageFormat);

    return ValidExtensions.Select(x =>
        (ImageFormat)t.GetProperty(x.Substring(0, 1).ToUpper() + x.Substring(1))
                      .GetValue(null)).ToList();

}

svick在评论中留下了另一种解决方案,它更明确地表明了你的意图。

不是将字符串转换为标题大小写以使其与方法调用匹配,而是可以使用GetProperty()的不同重载来传递位掩码,告诉它如何搜索...在这种情况下,找到一个公共静态成员并完全忽略该情况。

private List<ImageFormat> GetValidImageFormats()
{
    var t = typeof(ImageFormat);

    return ValidExtensions.Select(x =>
        (ImageFormat)t.GetProperty(x, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Static)
                      .GetValue(null)).ToList();

}