我有 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);
}
}
您应该能够定义所有组件都实现的接口。
public interface IMyComponent
{
public void CodeGen();
}
然后在代码检查中:
if (component is IMyComponent myComponent)
{
myComponent.CodeGen();
}