我创建了三个接口:
interface A
{
B obj{ get; }
}
interface B
{
C obj { get; }
}
interface C { }
[Export(typeof(C))]
class class C1 : C
{
//.........
}
[Export[typeof(B)]
[ExportMetadata("Name", "ABC")
class class1 : B
{
[Import(typeof(C))]
public C Cvalues;
public C obj
{
get { return Cvalues; }
}
}
[Export(typeof(B))]
[ExportMetadata("Name", "XYZ")]
class class2 : B
{
[Import(typeof(C))]
public C Cvalues;
public C obj { get { return Cvalues; } }
}
现在,我想要接口A中的接口B的导出元数据
[Export(typeof(A))
class AA : A
{
// how i get the B here
[Import(typeof(B)]
public B Bvalues;
public B objB { get { return Bvalues; } }
}
如果我尝试在接口A中创建接口B的属性,那么在B的一次导入时它会给我输出但是ImportMany呢,因为接口B返回ImportMany ...
请告诉我如何在界面A中获取我的所有界面B导出。
答案 0 :(得分:1)
可以使用Lazy<T, TMetdat>
实例导入元数据。简单来说,这意味着:
[Import(typeof(B))]
Lazy<B, IDictionary<string, object>> _b;
public B ObjectB { get { return _b.Value; } }
public string NameB { get { return _b.Metadata["Name"]; } }
但是,定义元数据合同通常是个好主意,例如:
public interface INameMetdata
{
string Name { get; }
}
您可以使用它而不是字典:
[Import(typeof(B))]
Lazy<B, INameMetadata> _b;
public B ObjectB { get { return _b.Value; } }
public string NameB { get { return _b.Metadata.Name; } }
使用元数据合约将使您能够使用静态类型的界面实现,MEF将自动为您投射。