c# - 创建一个委托,它返回枚举的底层 int,而不知道运行时的枚举类型
问题描述
我正在编写一个设置系统,它依赖于向属性添加属性,然后使用反射。
例如,我通过将 SliderAttribute 添加到浮动属性来创建滑块,然后找到所有这些属性并创建委托来修改相关属性,如下所示:
Func<float> getterDelegate = Delegate.CreateDelegate(typeof(Func<float>), arg, property.GetGetMethod()) as Func<float>;
Action<float> setterDelegate = Delegate.CreateDelegate(typeof(Action<float>), arg, property.GetSetMethod()) as Action<float>;
settingObj = new Slider(sliderAttribute, getterDelegate, setterDelegate);
现在,我想通过对枚举值应用相同的逻辑来创建多项选择对象。那就是我想生成通过底层类型修改枚举属性的getter/setter委托(我们可以假设它总是int。)
理想情况如下,它返回错误ArgumentException: method return type is incompatible
。如果我使用“枚举”类型,结果相同。
Func<int> getterDelegate = Delegate.CreateDelegate(typeof(Func<int>), arg, property.GetGetMethod()) as Func<int>;
Action<int> setterDelegate = Delegate.CreateDelegate(typeof(Action<int>), arg, property.GetSetMethod()) as Action<int>;
settingObj = new MultipleChoice(multipleChoiceAttribute, getterDelegate, setterDelegate, property.PropertyType);
解决方案
您可以创建返回并采用实际枚举类型的委托,如下所示:
Delegate getterEnumDelegate = Delegate.CreateDelegate(
typeof(Func<>).MakeGenericType(property.PropertyType), arg, property.GetGetMethod()
);
Delegate setterEnumDelegate = Delegate.CreateDelegate(
typeof(Action<>).MakeGenericType(property.PropertyType), arg, property.GetSetMethod()
);
要将这些转换为Action<int>
and Func<int>
,您只需执行以下操作:
Func<int> getterDelegate = () => (int)getterEnumDelegate.DynamicInvoke();
Action<int> setterDelegate = x => setterEnumDelegate.DynamicInvoke(x);
推荐阅读
- vb.net - 检查 vb.net 中的文件格式
- java-8 - 在 java 流中,map 函数无法识别我的局部变量
- ajax - 如何在yii2中通过pjax和非pjax保存表单?
- jquery - 使用 jquery 规则确认密码不起作用
- uwp - 在 UWP 中检测 Windows 10 S-Mode
- android - 尝试在 Windows 上执行本机应用程序时出错
- protractor - 如何在茉莉花框架(量角器)中使用无限循环?
- opencart - 从一个站点重定向到另一个站点
- html - bootstrap 4轮播相同高度,适用于不同图像尺寸和屏幕尺寸
- php - Zoho JSON 结果转换为 CSV 文件