Wie führe ich eine Erweiterungsmethode über Reflektion von einer anderen Erweiterungsmethode aus? [Duplikat]C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Wie führe ich eine Erweiterungsmethode über Reflektion von einer anderen Erweiterungsmethode aus? [Duplikat]

Post by Anonymous »

Ich habe die folgende Erweiterungsmethode:

Code: Select all

public static class ListExtensions
{
public static IList AddRangeByKey(
this IList list, string keyName,
IEnumerable arrayElements) =>
list.AddRange(keyName, arrayElements);

// the other code is omitted for the brevity
}
Ich möchte die obige Erweiterungsmethode über Reflektion aufrufen, da ich T nicht kenne. Es sieht also so aus, als könnten wir einfach Reflection verwenden:

Code: Select all

public static class UrlHelper
{
public static IEnumerable ToKeyValuePairs(
this object obj)
{
List keyValuePairs = new();

IEnumerable
 props = obj.GetType().GetProperties()
.Where(p => p.GetValue(obj, null) != null);
foreach (PropertyInfo p in props)
{
object value = p.GetValue(obj, null);
IEnumerable enumerable = value as IEnumerable;
if (enumerable != null)
{
MethodInfo addRangeDef = typeof(ListExtensions).GetMethods()
.Where(x => x.Name == "AddRangeByKey" && x.IsGenericMethod)
.FirstOrDefault();
Type ienumerable = value.GetType()
.GetInterface("System.Collections.Generic.IEnumerable`1");
if (ienumerable != null)
{
MethodInfo addRange = addRangeDef
.MakeGenericMethod(ienumerable.GetGenericArguments());
addRange.Invoke(null, new object[] { p.Name, value }); // this
// line of code throws an exception 'addRange.Invoke(null, new
// object[] { p.Name, value })' threw an exception of type
// 'System.Reflection.TargetParameterCountException'.
// Message says `Parameter count mismatch`.

// I tried already like this:
// adRangeDef.Invoke(null, new object[] {
// typeof(UrlHelper), p.Name, value });
}
}
}

return keyValuePairs;
}
}
Der Code, den ich auszuführen versuche, sieht folgendermaßen aus:

Code: Select all

object queryObject = new SearchUsers
{
Page = 1, PageSize = 10,
Filters = new List{new FilterParameter {
Field = "name",
Val = "Bob" } }
};

IEnumerable foo = queryObject.ToKeyValuePairs();
Diese Codezeile addRange.Invoke(null, new object[] { p.Name, value }) löst also eine Ausnahme aus:

Code: Select all

'addRange.Invoke(null, new object[] { p.Name, value })' threw
an exception of type
'System.Reflection.TargetParameterCountException'.
Message says `Parameter count mismatch`.`
Ich habe auch versucht, so aufzurufen:

Code: Select all

addRangeDef.Invoke(null, new object[] { p.Name, value })
Aber die Ausnahme, die ausgelöst wurde, sah so aus:

Code: Select all

Late bound operations cannot be performed on types or
methods for which ContainsGenericParameters is true.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post