簡體   English   中英

無法獲取ValueInjecter來映射COM對象

[英]Can't get ValueInjecter to map COM objects

請參閱以下代碼。 使用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映射防火牆API.dll類 ”更改為“ 無法獲取ValueInjecter映射COM對象 ”。

它不起作用,因為這樣做:

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()相同,但是它從提供的Type中讀取目標屬性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM