mardi 27 août 2019

How to "invoke" PropertyInfo of type Action<,> in runtime

I have a generic class and a property of type Action<,>. I am wondering if there is a way to actually invoke this delegate using reflection in runtime, not just set value to this class property (via PropertyInfo.SetValue).

I tried a lot of things, like using expressions, dummy casting, read forums, but none of the solutions worked for me.

Workaround: What I could think of is creating a dummy method which internally calls the delegate, and with reflection is fairly easy to invoke this method.

public class Student
{
    public string Name { get; set; }
}

public class ConfigData<T> 
    where T: class
{
    public Action<T, object> ValueInjector { get; set; }

    public void SetValue(T entity, object valueToSet)
    {
        this.ValueInjector(entity, valueToSet);
    }
}

class Program
{
    static void Main(string[] args)
    {
        var configObj = new ConfigData<Student>()
        {
            ValueInjector = (x, y) =>
            {
                // Some custom logic here
                x.Name = y.ToString();
            }
        };

        // Parameters
        Student student = new Student();
        object valueToSet = "Test";

        Type configType = configObj.GetType();
        PropertyInfo propertyInfo = configType.GetProperty("ValueInjector");

        // Invoke the property info somehow with the parameters ?

        // Workarround - invoke a dummy method instead
        MethodInfo methodInfo = configType.GetMethod("SetValue");
        methodInfo.Invoke(configObj, new object[] { student, valueToSet });

        Console.WriteLine(student.Name);
    }
}

I want to be able to invoke the propertyInfo variable and pass to it the two parameters I already have (student, valueToSet), since I know that it represent a delegate which can be run.





Aucun commentaire:

Enregistrer un commentaire