4imble
4imble

Reputation: 14416

Detecting if class property is a reference type

Is it possible when looking at a class' properties to detect if any of them is a reference type.

Take below as an example:

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 and IsActive are properties but Client is a reference type. Is there a way of detecting this?

Many thanks, Kohan.

Addendum

The reason i ask is: I am using a mapper that checks types are the same before matching property names and copying the values. My hope is to detect classes and override the type matching and simply copy the classes properties if the THEY type match.

Upvotes: 45

Views: 50611

Answers (7)

yaksplat
yaksplat

Reputation: 73

Check if the type is a string and check if it is a class.

        public static bool IsNonStringClass(this Type type)
        {
            if (type == null || type == typeof(string))
                return false;
            return typeof(Type).IsClass;
        }

Upvotes: 6

Michael Brown
Michael Brown

Reputation: 1718

If using TypeSupport nuget package you can simply do:

typeof(ProgrammeClient).GetExtendedType().IsReferenceType;

TypeSupport does inspection and provides deeper insight on the capabilities of a given type, handling things like strings, enums etc and makes it easier to code these types of things.

Upvotes: 1

Jake Pearson
Jake Pearson

Reputation: 27717

You can use a little reflection to see if a property is a value type or a class type. Class is probably what you mean by "object". All types in .NET derive from the object type.

Client.GetType().IsClass

Or you can loop through all properties and see which are compound

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

Upvotes: 29

Jon Skeet
Jon Skeet

Reputation: 1500065

Well, it sounds like you may be trying to detect the difference between a value type and a reference type. You can find that out using Type.IsValueType... but be aware that value types can easily have properties too. (Think about DateTime for example.) Also, some types which you may want to regard as "not objects" are reference types - string being a prime example.

Another option would be to use Type.IsPrimitive - is that what you're looking for? If so, you should be aware that decimal, DateTime and string are not primitive types.

If you can describe exactly what makes a type an "object" in your way of thinking (or rather, in whatever way makes a semantic difference in what you're trying to do with your type). I suspect you don't currently have a very clear set of criteria - coming up with those criteria may well clarify other aspects of your current task, too.

Upvotes: 66

nothrow
nothrow

Reputation: 16168

You can enumerate the properties via Reflection, and check them:

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

Upvotes: 2

Derrick
Derrick

Reputation: 2552

The Type.IsvalueType property can reveal this.

Id.GetType().IsValueType

This will be True for Id, false for a class

Upvotes: 1

thecoop
thecoop

Reputation: 46098

All properties in your example return objects, as everything is an object in .NET; int and bool are objects. If you mean a reference type, as opposed to value types, then you can do the following:

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

Upvotes: 4

Related Questions