[英]Pass Type as a parameter to template function
我正在重构我的代码,我想替换这些调用:
OnClickEv onClickPr = GetScriptPr<OnClickEv>(controlProps);
if (onClickPr != null && onClickPr.Value != null)
_script.Add(onClickPr.Value.ToString());
OnDblClickEv onDblClickPr = GetScriptPr<OnDblClickEv>(controlProps);
if (onDblClickPr != null && onDblClickPr.Value != null)
_script.Add(onDblClickPr.Value.ToString());
OnKeyDownEv onKeyDownEv = GetScriptPr<OnKeyDownEv>(controlProps);
if (onKeyDownEv != null && onKeyDownEv.Value != null)
_script.Add(onKeyDownEv.Value.ToString());
使用单个 function 我只需传递应处理的类或类型:
CreateSimplePropWithParam(controlProps, new List<Type>()
{
typeof(OnClivkEv), typeof(OnDblClickEv), typeof(OnKeyDownEv)
});
模板 function:
private T GetScriptPr<T>(List<ScriptPr> properties) where T : ScriptPr
{
var pr = properties.Where(x => x.GetType() == typeof(T)).FirstOrDefault();
return (T)pr;
}
但是如何将该类型参数传递给模板呢?
private void CreateSimplePropWithParam(List<ScriptPr> controlProps, DesignerPlatform designerPlatform, object param, List<Type> propsList)
{
foreach (Type type in propsList)
{
T prop = (ScriptPr)GetScriptPr<T>(controlProps); <<< what to do with T?
if (prop != null && prop.Value != null)
{...
}}}
为此,您需要使用反射; 特别是,你想要MakeGenericMethod
,即
static readonly MethodInfo s_GetScriptPr = typeof(Whatever)
.GetMethod("GetScriptPr", BindingFlags.Instance | BindingFlags.NonPublic);
...
object result = s_GetScriptPr.MakeGenericMethod(type).Invoke(targetInstance,
new object[] { controlProps });
注意:generics 和反射不容易一起正确使用,如果可以避免,通常应该这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.