gpt4 book ai didi

c# - 无法让 ValueInjecter 映射 COM 对象

转载 作者:太空宇宙 更新时间:2023-11-03 16:47:34 25 4
gpt4 key购买 nike

请看下面的代码。使用 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 对象”。

最佳答案

它不起作用是因为:

fwRule.GetType().GetProperties().Count()// is 0 

或者使用 PropertyDescriptor 做同样的事情也会返回零,就像对象没有属性一样

解决方案是编写一个注入(inject),从中获取属性的类型:

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() 相同,但它从提供的类型中读取目标属性

关于c# - 无法让 ValueInjecter 映射 COM 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5365738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com