Как вызвать метод с параметрами типа класса C # - PullRequest
0 голосов
/ 27 февраля 2019

Я хочу вызвать мой метод с помощью отражения, но мой класс использует значение ссылочного типа:

namespace XXX.Domain.XY.Products.Products.Myprovider {
public class ProductClass
{
    public void Save(Product entity)
   {

   }
}

Как я могу передать MyEntity с помощью приведенного ниже кода?Save метод имеет параметр типа класса.

Assembly loadedAssembly = Assembly.LoadFile(dll);
//if (loadedAssembly.GetName().Name== "FFSNext.Domain")

Assembly asm = Assembly.LoadFrom($"{binPath}FFSNext.Domain.dll");
Type t = asm.GetType("XXX.Domain.XY.Products.Products.Myprovider.ProductClass");
//Get and display the method.
MethodBase Mymethodbase = t.GetMethod("Save");
Console.Write("\nMymethodbase = " + Mymethodbase);

//Get the ParameterInfo array.
ParameterInfo[] Myarray = Mymethodbase.GetParameters();

Type testType = t;
object testInstance = Activator.CreateInstance(testType);

MethodInfo openMethod = testType.GetMethod("Save");

openMethod.Invoke(testInstance, new object[] { new Product() });

1 Ответ

0 голосов
/ 28 февраля 2019

Во-первых, вам нужен класс Product и класс ProductClass:

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

    public Product(string Name)
    {
        this.Name = Name;
    }
}

(Очевидно, вы можете настроить свой класс Product с другими свойствами и т. Д.)

и ваш ProductClass класс:

public class ProductClass
{
    public void Save(Product value)
    {
        // Save your product
        Console.WriteLine("Save method called successfully with the product " + value.Name);
    }
}

Затем вам нужно вызвать свой метод следующим образом:

static void Main()
{
    // The namespace of your ProductClass
    string NameSpace = "SomeNameSpace.SomeSecondaryNameSpace";

    Product toSave = new Product(Name:"myProduct");

    // Load your assembly. Where it is doesn't matter
    Assembly assembly = Assembly.LoadFile("Some Assembly Path");

    // Load your type with the namespace, as you already do
    Type productClass = assembly.GetType($"{NameSpace}.ProductClass");

    // Type.GetMethod returns a MethodInfo object and not MethodBase
    MethodInfo saveMethod = productClass.GetMethod("Save");

    // Create an instance of your ProductClass class
    object instance = Activator.CreateInstance(productClass);

    // Invoke your Save method with your instance and your product to save
    saveMethod.Invoke(instance, new object[] { toSave });

    Console.ReadKey();
}

Этот код отлично работает для меня ... У вас есть какие-либоошибки с этим?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...