动态组件 Blazor 运行公共方法

问题描述 投票:0回答:1

我有 Blazor 中 DynamicComponents 的引用列表。 每个都可能是不同的类型。 每个都包含一个名为“CodeGen”的方法 我试图调用公共方法,但不能从 DynamicComponent 本身调用。 我可以在“实例”上使用“转换”为实际类型,但它仍然没有对 CodeGen 方法的引用。

我采取了以下有效的方法,但我认为很草率。 如果没有这个大的 if 语句,我如何访问公共方法。我不确定泛型和接口可能有帮助。

          var name = mType.Name.ToLower();
           switch (name)
           {
               case "line":
                   Line lineComponent = dynComponentObject as Line;
                   lineComponent.CodeGen(myCode);
                   break;
               case "qlabel":
                   QLabel qlabelComponent = dynComponentObject as QLabel;
                   qlabelComponent.CodeGen(myCode);
                   break;
               case "colorcomponent":
                   ColorComponent colorComponent = dynComponentObject as ColorComponent;
                   colorComponent.CodeGen(myCode);
                   break;
               case "datefield":
                   DateField df = dynComponentObject as DateField;
                   df.CodeGen(myCode);
                   break;
               case "dropdown":
                   DropDown dd = dynComponentObject as DropDown;
                   dd.CodeGen(myCode);
                   break;
               case "map":
                   Map m = dynComponentObject as Map;
                   m.CodeGen(myCode);
                   break;
               default:
                   break;
           }

我使用 System.Reflection 让它工作:

foreach (var lineItem in item.Value.componentRefs) {
    var tType = lineItem.Value.Instance.GetType();
    MethodInfo codeGenMethod = tType.GetMethod("CodeGen");
    if (codeGenMethod != null)
    {
        Object[] myObjectParms = new Object[1];
        myObjectParms[0] = myCode;
        codeGenMethod.Invoke(lineItem.Value.Instance, myObjectParms);
    }
}
blazor dynamic-components
1个回答
0
投票

您应该能够定义所有组件都实现的接口。

public interface IMyComponent
{
    public void CodeGen();
}

然后在代码检查中:

if (component is IMyComponent myComponent)
{
    myComponent.CodeGen();
}
© www.soinside.com 2019 - 2024. All rights reserved.