Question

I have a Person class :

public class Person 
{
    virtual public long Code { get; set; }
    virtual public string Title { get; set; }       
    virtual public Employee Employee { get; set; }
}

I need to a generic solution for get all properties of Person class without properties by custom class types. Means select Code , Title properties.

typeof(Person).GetProperties();           //Title , Code , Employee
typeof(Person).GetProperties().Where(x => !x.PropertyType.IsClass); // Code

How can I select all properties without custom class types? (Code , Title)

Was it helpful?

Solution

One way is to check the ScopeName of the Module of the Type:

typeof(Person).GetProperties().Where(x => x.PropertyType.Module.ScopeName == "CommonLanguageRuntimeLibrary")

since there is no direct way that to tell if a type is built-in or not.

To get some other ideas, see here, here and here.

OTHER TIPS

I would suggest using an attribute:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class SimplePropertyAttribute : Attribute
{
}

public class Employee { }

public class Person
{
    [SimpleProperty]
    virtual public long Code { get; set; }

    [SimpleProperty]
    virtual public string Title { get; set; }

    virtual public Employee Employee { get; set; }
}

internal class Program
{
    private static void Main(string[] args)
    {
        foreach (var prop in typeof(Person)
            .GetProperties()
            .Where(z => z.GetCustomAttributes(typeof(SimplePropertyAttribute), true).Any()))
        {
            Console.WriteLine(prop.Name);
        }

        Console.ReadLine();
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top