Передать тип в качестве параметра в функцию шаблона - PullRequest
0 голосов
/ 05 ноября 2019

Я выполняю рефакторинг своего кода и хочу заменить эти вызовы:

            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;
        }

Но как передать этот параметр типа в шаблон?

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

1 Ответ

2 голосов
/ 05 ноября 2019

Для этого вам нужно использовать отражение;в частности, вы хотите 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 });

Примечание: генерики и рефлексии не так легко использовать вместе, и если вы можете избежать этого, вам обычно следует это делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...