【问题标题】:Pass Type as a parameter to template function将类型作为参数传递给模板函数
【发布时间】:2019-11-05 07:41:48
【问题描述】:

我正在重构我的代码,我想替换这些调用:

            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());

使用单个函数,我只需传递应处理的类或类型:

CreateSimplePropWithParam(controlProps, new List<Type>()
            {
                typeof(OnClivkEv), typeof(OnDblClickEv), typeof(OnKeyDownEv)
            });

模板函数:

private T GetScriptPr<T>(List<ScriptPr> properties) where T : ScriptPr
        {
            var pr = properties.Where(x => x.GetType() == typeof(T)).FirstOrDefault();

            return (T)pr;
        }

但是如何将 Type 参数传递给 Template?

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)
                {...
}}}

【问题讨论】:

标签: c# .net windows winforms templates


【解决方案1】:

为此,您需要使用反射;特别是,你想要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 });

注意:泛型和反射并不容易正确地一起使用,如果你可以避免它,你通常应该这样做。

【讨论】:

  • 感谢您的澄清。我会找到一种不同的方式,使用反射看起来真的很复杂。
  • @Slappy 仅使用它是复杂(如上)...有效地使用它(在速度和分配方面) 比那复杂得多 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 2018-09-28
  • 1970-01-01
  • 2019-04-24
  • 2021-02-28
  • 1970-01-01
  • 2017-05-10
相关资源
最近更新 更多