Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get parameters of an Attribute using Reflection

Tags:

c#

reflection

My question is there any way to retrieve the parameter list with its value using Reflection?

I want to use reflection to get the parameter list from the PropertyInfo.

 Author author = (Author)attribute;
 string name = author.name;

is not OK. As there will be many Attribute, which is not typeof Author.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property,  AllowMultiple = true)]
public class Author : Attribute
{
    public Author(string name, int v)
    {
        this.name = name;
        version = v;
    }

    public double version;
    public string name;
}

public class TestClass
{
    [Author("Bill Gates", 2)]
    public TextBox TestPropertyTextBox { get; set; }
}
like image 971
seasong Avatar asked Sep 28 '10 03:09

seasong


2 Answers

using this program

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {
            Console.WriteLine("Reflecting TestClass");
            foreach (var property in typeof(TestClass).GetProperties()) {
                foreach (Author author in property.GetCustomAttributes(typeof(Author), true).Cast<Author>()) {
                    Console.WriteLine("\tProperty {0} Has Author Attribute Version:{1}", property.Name, author.version);
                }
            }
            var temp = new TestClass();
            Console.WriteLine("Reflecting instance of Test class ");
            foreach (var property in temp.GetType().GetProperties()) {
                foreach (Author author in property.GetCustomAttributes(typeof(Author), true).Cast<Author>()) {
                    Console.WriteLine("\tProperty {0} Has Author Attribute Version:{1}", property.Name, author.version);
                }
            }
        }

    }

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property, AllowMultiple = true)]
    public class Author : Attribute {
        public Author(string name, int v) {
            this.name = name;
            version = v;
        }

        public double version;
        string name;
    }

    public class TestClass {
        [Author("Bill Gates", 2)]
        public TextBox TestPropertyTextBox { get; set; }
    }

}

I get this output:

alt text

like image 51
Preet Sangha Avatar answered Nov 04 '22 23:11

Preet Sangha


I assume by parameter list, you mean a list of all attribute uses?

If not, this code shows you how to get an attribute using reflection on a whole class. But you should be able to take what you need.

So here is a method to find all attributes of a certain type, on any property inside a TestClass

public IEnumberable<Result> GetAttributesFromClass(TestClass t)
{

    foreach(var property in t.GetType().GetProperties())
    {
        foreach(Author author in property.GetCustomAttributes(typeof(Arthor), true))
        {
             // now you have an author, do what you please
             var version = author.version;
             var authorName = author.name;

             // You also have the property name
             var name = property.Name;

             // So with this information you can make a custom class Result, 
             // which could contain any information from author, 
             // or even the attribute itself
             yield return new Result(name,....);
        }

    }
}

Then you could go:

var testClass = new TestClass();

var results = GetAttributesFromClass(testClass);

Also, you may want your public double version and string name to be properties. Something like this:

public double version
{
    get; 
    private set;
}

Which will allow version to be set from the constructor, and read from anywhere.

like image 21
PostMan Avatar answered Nov 04 '22 21:11

PostMan