Reputation: 3491
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
)
Upvotes: 5
Views: 3335
Reputation: 48975
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();
}
}
Upvotes: 1
Reputation: 101052
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.
Upvotes: 4