2011-03-19 3 views
2

다음 코드를 참조하십시오. AutoMapper를 사용할 때 테스트가 통과되었지만 ValueInjecter를 사용할 때 실패했습니다.COM 개체를 매핑 할 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 클래스와 관련이 보인다. 그래서 제목을 ""에서 "FirewallAPI.dll 클래스"에 매핑 할 수 없습니다. "COM 객체를 매핑 할 ValueInjecter를 얻을 수 없습니다." ".

답변

0

이 일을하기 때문에 작동하지 않습니다 : 개체가 속성

솔루션이 주사를 작성하는 것입니다을 가지고하지 않는 것처럼 그것의,

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

또는도 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()과 동일하지만 공급 유형

+0

에서 대상 속성이 그래서 문제가 ValueInjector가 fwRule''의 실제 유형을 얻을 수없는 것 같다 읽습니다. 'fwRule'은 COM 객체입니다. 'GetType()'을 사용하면'System .__ ComObject'가 반환됩니다. AutoMapper는'Mapper.CreateMap ()'을 통해 실제 타입을 알 수 있기 때문에 COM 객체와 잘 동작합니다. ValueInjector에 대한 해결 방법은 무엇입니까? 감사. –

+0

@ caveman 예, 제 편집 대답을보세요 – Omu

+0

코드를 보내 주셔서 감사합니다! 내 프로젝트에서 훌륭하게 작동합니다. –