これが私の状況です: プロパティを再設定するクラスがあります:
public abstract class RootProperty {
public int Id {get; set;}
}
public class AProperty {}
public class BProperty {}
そして、これらの戦利品があるようにしましょう:
public class ZProperty {}
そして、この各プロパティの値、
public abstract class RootValue {
public RootProperty Property {get;set;}
}
public class AValue : RootValue {
public AValue(AProperty) { ... }
public string Value {get; set;}
}
public class ZValue : RootValue {
public ZValue(ZProperty) { ... }
public sometipe Value {get;set;} }
実際、各クラスは、物が持たなければならないプロパティのタイプを表しています。したがって、特定のドメインで値が必要な文字列によってプロパティが定義されていると言いたい場合は、次のように言います。
public class DomainProperty {
public ICollection<string> Domain {get; set;}
}
public class DomainValue {
public DomainValue(DomainProperty) {...}
public string Value
{
set {
if (!this.Property.Domain.Any(d=>d==value)) {
throw new Exceptin("Value out of range!");
}
}
}
}
だから私は犬が小さくても大きくてもいいし、私の犬は大きい。
DomainProperty DogsSize = new DomainProperty { Domain= ["big","small"] }
DomainValue MyDogSize = new DomainValue(color) { Value = "big" }
これを使用して、最大値と最小値などを含む数値範囲のプロパティを定義できます。最初の質問は次のとおりです。カスタマイズ可能なプロパティの型に関するこの問題の解決策を他に考えられますか?
さて、ここに投稿する質問: 前のロジックはサーバー側にあり、クライアント側から抽象的な dtos のリストを受け取ります。
public abstract class RootDto { public int PropertyId { get; set; } }
public class ADto : RootDto { public string Value { get; set; } }
public class BDto: RootDto { public bool Value { get; set; } }
public class ZDto : RootDto { public someothertype Value { get; set; } }
RootDto PropertyId を使用すると、元の RootProperty を見つけることができます。?Value の新しいインスタンスを作成し、値を ?Dto.Value に設定したいと考えています。今、私は多くのキャストでこれを持っています:
List<RootDto> listDto;
foreach(dto in listDtio) {
if (someDto is ADto) {
ADto castedDto = (ADto) dto;
AProperty dtoProperty = (AProperty) Repository.findRootProperty(dto.PropertyId);
AValue valueForDto = new AValue(dtoProperty);
valueForDto.Value = castedDto.Value;
}
if ...(B.....Z)
}
それは機能しますが、15 の可能なプロパティ クラスがあるとしたら、反復コードの行が大量になります。リフレクションと動的タイプを調査しましたが、何も見つかりませんでした。お時間をいただきありがとうございます。良い説明ができれば幸いです。