Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I add an extension method to many classes?

Tags:

c#

reflection

I have about 1000 classes in which i need to count the number of properties of. I have the following code:

    public static int NumberOfProperties()
    {
        Type type = typeof(C507);
        return type.GetProperties().Count();
    }

I could copy and paste this in to each class changing the typeof parameter but this seems a bit tedious.

Is there anyway to make an extensions method to do this by just doing var nop = C507.NumberOfProperties();?

like image 522
Houlahan Avatar asked Sep 11 '25 02:09

Houlahan


2 Answers

Just to add to the answers suggesting an extension for object for completeness: you can also consider implementing an extension only for Type:

public static int GetPropertyCount(this Type t)
{
    return t.GetProperties().Length;
}

and use it like this:

typeof(C507).GetPropertyCount();

The advantage is that you can get the number of properties directly from the type and do not have to create an instance first.

like image 63
René Vogt Avatar answered Sep 12 '25 16:09

René Vogt


So you can write an extension method that uses object or one that uses type.

public static class ObjectExtensions
{
    public static int GetNumberOfProperties(this object value)
    {
        return value.GetType().GetProperties().Count();
    }

    public static int GetNumberOfProperties(this Type value)
    {
        return value.GetProperties().Count();
    }
}

Usage:

new C507().GetNumberOfProperties();
typeof(C507).GetNumberOfProperties();

However, you explicitly state two things:

I could copy and paste this in to each class changing the typeof

I have about 1000 classes

You'll likely not want to instantiate a 1000 classes or copy and paste typeof() 1000 times

In this case, you will want to read them all from the Assembly.

So something like:

typeof(SomeClass).Assembly.GetTypes().Select(x => new
  {
       x.Name, 
       PropertyCount = x.GetType().GetProperties().Count()
  });

Where SomeClass is a class (doesn't matter which) where all the classes reside.

I just simply select them out into an anonymous object which contains the Types name and property count.

This:

typeof(SomeClass).Assembly

Is just a convience way to get the assembly. There are other ways.

Assembly.GetAssembly(typeof(Program)).GetTypes()
Assembly.GetCallingAssembly().GetTypes()
Assembly.Load("Some Assemble Ref").GetTypes()

You can do allsorts with the types that you find. If you select out the Type itself, you can instantiate it later using Activator.CreateInstance (if it has parameterless constuctor). You can also auto fill the properties with reflection as well.

like image 27
Callum Linington Avatar answered Sep 12 '25 15:09

Callum Linington