美好的一天,请您协助我完成这项复杂的任务。我用 MEF 开发模块应用程序。每个模块都有这样的元数据:
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public abstract class ModuleMetadata : ExportAttribute, IArmModuleMetadata
{
private ModuleDescriptor _descriptor;
public ModuleMetadata(string name, string code, string category, string iconUri)
: base()
{
_descriptor = new ModuleDescriptor(name, code, category, iconUri);
}
}
我这样使用它:
[Export(typeof(IArmTaskModule))]
[TaskModuleMetadata("test1", "code",
@"pack://application:,,,/WpfVisualModule;component/Icons/chart_line_error.png",
"road_weather_stations",
TargetItem = TargetItems.ControlComplex)]
class AdvancedChartContract : Burstroy.Arm.Contracts.IArmTaskModule
对于每个模块,都有一组由 Dictionary<string, Settings.ParamDescriptor> CreateSettingsBlock()
in 方法生成的属性IArmModule
,其中 Key 包含属性代码,Value 包含花哨的名称和默认值。
在我的主应用程序中,我Lazy<T, TMetadata>
用于导入这样的模块
[ImportMany(typeof(IArmTaskModule), AllowRecomposition = true)]
private IEnumerable<Lazy<IArmTaskModule, IArmTaskModuleMetadata>> _taskModules;
这种方法中的问题Lazy<T, TMetadata>
将创建IArmTaskModule
用于从方法接收设置块的实例。我想通过向元数据添加属性信息来防止它。我试图用 new List () 扩展属性构造函数,但它失败了(属性限制),我也尝试创建新属性
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class ExportedParam : ExportAttribute, IArmModuleProperty
{
public ExportedParam(string code, string fancyName)
: base()
{
this.Code = code;
this.FancyName = fancyName;
//this.Value = value;
}
public string Code { get; private set; }
public string FancyName { get; private set; }
public object Value { get; private set; }
}
但它也失败了。
[ExportedParam("a", "b")]
[ExportedParam("b", "c")]
[ExportMetadata("fffffuuu", 2)]
class MeteoSummary : IArmVisualModule,
有没有人有什么建议?