web-dev-qa-db-ja.com

クラスプロパティが参照型かどうかの検出

クラスのプロパティを参照するときに、それらのいずれかが参照型であるかどうかを検出することは可能ですか?.

以下を例にとります。

public class Client
{
   public int Id { get; set; }
   public string Name { get; set; }
}

public class ProgrammeClient
{
    public int Id { get; set; }
    public bool IsActive { get; set; }
    public IClient Client { get; set; }
}

ProgrammeClient:-
IdとIsActiveはプロパティですが、クライアントは参照タイプです。これを検出する方法はありますか?

感謝します、コーハン。

補遺

私が尋ねる理由は、プロパティ名を照合して値をコピーする前にタイプが同じであることを確認するマッパーを使用していることです。私の希望は、クラスを検出して型の一致をオーバーライドし、THEYの型が一致する場合はクラスのプロパティをコピーすることです。

31
4imble

まあ、それはあなたのように聞こえるmay値型と参照型の違いを検出しようとしている。 Type.IsValueType ...しかし、値の型にもプロパティを簡単に設定できることに注意してください。 (たとえば、DateTimeについて考えてみてください。)また、「オブジェクトではない」と見なすことができるいくつかの型は参照型です-stringが主な例です。

別のオプションは Type.IsPrimitive -is thatあなたが探しているものは?その場合、decimalDateTimeおよびstringnotプリミティブ型であることを認識しておく必要があります。

exactlyと記述することができる場合、あなたの考え方で型を「オブジェクト」にするもの(または、むしろ、どのような方法で、型で実行しようとしていることに意味上の違いをもたらすか)。現在、明確な基準のセットがないのではないかと思います。これらの基準を考え出すと、現在のタスクの他の側面も明確になる可能性があります。

44
Jon Skeet

少しリフレクションを使用して、プロパティが値型かクラス型かを確認できます。クラスとは、おそらく「オブジェクト」という意味です。 .NETのすべてのタイプは、オブジェクトタイプから派生します。

Client.GetType().IsClass

または、すべてのプロパティをループして、どれが複合であるかを確認できます

foreach(var p in ProgrammeClient.GetType().GetProperties())
{
     if(p.PropertyType.IsClass) Console.WriteLine("Found a class");
}
18
Jake Pearson

すべてが.NETのオブジェクトであるため、例のすべてのプロパティはオブジェクトを返します。 intおよびboolはオブジェクトです。値タイプではなく参照タイプを意味する場合は、以下を実行できます。

foreach (PropertyInfo pi in typeof(Client).GetProperties()) {
    if (pi.PropertyType.IsClass) {
        // reference type
        // DoMyFunkyStuff
    }
}
4
thecoop

リフレクションを介してプロパティを列挙し、それらを確認できます。

bool ContainsOnlyValues() { 
    return typeof(ProgrammeClient).GetProperties().All(x => x.PropertyType.IsValueType);
}
2
nothrow

Type.IsvalueType プロパティはこれを明らかにできます。

Id.GetType().IsValueType

これはIDの場合はTrue、クラスの場合はFalseになります

1
Derrick

TypeSupport nugetパッケージを使用している場合は、次のようにするだけです。

typeof(ProgrammeClient).GetExtendedType().IsReferenceType;

TypeSupportは検査を行い、指定された型の機能に関するより深い洞察を提供し、文字列や列挙型などの処理を行い、これらの型のコーディングを容易にします。

0
Michael Brown