で動作します。この
Mapper.CreateMap<OpenName, RestrictedName>()
.ConstructUsing(s => new RestrictedName(s.Name));
ようConstructUsingを使用することができますAutoMapperではプライベートセッターでプロパティをマップすることができるようになりました。リフレクションを使用してオブジェクトを作成しています。
例クラス:
public class Person
{
public string Name { get; set; }
public string Surname { get; set; }
}
public class PersonDto
{
public string Fullname { get; private set; }
}
とマッピング:
AutoMapper.Mapper.CreateMap<Person, PersonDto>()
.ForMember(dest => dest.Fullname, conf => conf.MapFrom(src => src.Name + " " + src.Surname));
var p = new Person()
{
Name = "John",
Surname = "Doe"
};
var pDto = AutoMapper.Mapper.Map<PersonDto>(p);
AutoMapperは問題なくプライベートセッターとプロパティをマッピングします。カプセル化を強制する場合は、IgnoreAllPropertiesWithAnInaccessibleSetterを使用する必要があります。このオプションを使用すると、すべてのプライベートプロパティ(およびその他のアクセスできない)は無視されます。
AutoMapper.Mapper.CreateMap<Person, PersonDto>()
.ForMember(dest => dest.Fullname, conf => conf.MapFrom(src => src.Name + " " + src.Surname))
.IgnoreAllPropertiesWithAnInaccessibleSetter();
Silverlightを使用する場合、問題が発生します。 MSDNによると:https://msdn.microsoft.com/en-us/library/stfy7tfc(v=VS.95).aspx
In Silverlight, you cannot use reflection to access private types and members.
あなたがAutomapperのどのバージョンを使用していますか?あなたはそれをやってみましたか? – PatrickSteele
@blockhead実際、それは非常に重要な質問です。不変オブジェクトは、(設定者を公開することによって)自由に変更できるオブジェクトよりもはるかに優れた建築慣行です。これは、Entity Frameworkが最近、プライベートプロパティに水分補給する機能を追加し、ドメインモデルが最初の水分補給後に不変のままになることを可能にする正確な理由です。おそらく、彼らの建築をブラッシュアップする必要があるのは、レソリヤではありません。 ;) – Marchy
すみません。プライベートプロパティはプライベートであるはずです。それはオブジェクトに属するデータであり、オブジェクトだけが知っているので、そのデータについて知っておく必要があります。 – blockhead