请参见下面的代码。测试在使用AutoMapper时通过,但在使用ValueInjecter时失败:
using NetFwTypeLib;
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
INetFwPolicy2 policy = (INetFwPolicy2)Activator.CreateInstance(
Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
INetFwRules fwRules = policy.Rules;
Rule rule = new Rule();
foreach (INetFwRule fwRule in fwRules)
{
if (fwRule.Name == "HomeGroup Out")
{
//AutoMapper.Mapper.CreateMap<INetFwRule, Rule>();
//AutoMapper.Mapper.Map(fwRule, rule);
rule.InjectFrom(fwRule);
break;
}
}
Assert.IsTrue(rule.Name == "HomeGroup Out");
}
}
public class Rule
{
public string Name { get; set; }
}有什么想法吗?谢谢。
编辑:
根据Omu的回答,问题似乎与COM对象有关,而不仅仅是FirewallAPI.dll类。因此,我将标题从“无法让ValueInjecter映射FirewallAPI.dll类”改为“无法使ValueInjecter映射COM对象”。
发布于 2011-03-21 13:54:53
它不起作用是因为:
fwRule.GetType().GetProperties().Count()// is 0 或者使用PropertyDescriptor进行同样的操作也会返回零,就像对象没有属性一样
解决方案是编写一个将类型从何处获取属性的注入:
public class Same<T> : ValueInjection
{
protected override void Inject(object source, object target)
{
var props = typeof (T).GetInfos().ToArray();
var tp = target.GetInfos().ToArray();
for (var i = 0; i < props.Count(); i++)
{
var prop = props[i];
for (var j = 0; j < tp.Count(); j++)
{
if(prop.Name == tp[j].Name && prop.PropertyType == tp[j].PropertyType)
tp[j].SetValue(target,prop.GetValue(source, null),null);
}
}
}
}以及使用情况:
rule.InjectFrom<Same<INetFwRule>>(fwRule);这与默认的InjectFrom()相同,但它从提供的类型读取目标属性
https://stackoverflow.com/questions/5365738
复制相似问题