2

次のコードを参照してください。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 の回答に基づいて、問題は FirewallAPI.dll クラスだけでなく、COM オブジェクトに関連しているようです。そのため、タイトルを「ValueInjecter を取得して FirewallAPI.dll クラスをマップできません」から「ValueInjecter を取得して COM オブジェクトをマップできません」に変更しました。

4

1 に答える 1

0

次のことを行っているため、機能しません。

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

または、PropertyDescriptorreturn zero を使用して同じことを行うと、オブジェクトにプロパティがないように見えます

解決策は、プロパティを取得する場所から型を取得するインジェクションを作成することです。

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 からターゲット プロパティを読み取ります。

于 2011-03-21T13:54:53.083 に答える