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; }
}
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:
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With