簡體   English   中英

從對象列表創建運行時已知類型的列表並調用通用方法

[英]Create list of runtime-known type from object list and call generic method

我在內存中有IEnumerable<object>

這么說吧:

IEnumerable<object>() addedEntities = // ... some Linq-To-Object query

另外,我有一個帶有此簽名的方法:

public static IEnumerable<TSource> FilterByUniqueProp<TSource>
                (this IEnumerable<TSource> query, TSource model)
{
       // Do something according to this type
       var type = model.GetType();
}

如您所見,這是一種擴展方法。 因此,我無法動態調用它,我必須使用MethodInfo在運行時執行它。

在運行時中,我必須為某個運行時已知類型的Enumerable<T>動態調用此方法。 但是,不管我做什么,都行不通。 model.GetType()始終為Object或拋出異常。

類型'System.Linq.Enumerable + WhereSelectArrayIterator 2[System.Data.Objects.ObjectStateEntry,System.Object]' cannot be converted to type System.Collections.Generic.IEnumerable 1 [PersonDetail]'。

這是我嘗試過的:

 IEnumerable<object>() addedEntities = // ... some Linq-To-Object query

 Type listType = typeof(List<>);
 Type constructed = listType.MakeGenericType(model.GetType());
 dynamic myList = Activator.CreateInstance(constructed);
 myList = addedEntities;

 MethodInfo mesthod = typeof(DynamicLinqExtensions).GetMethod("FilterByUniqueProp");
 MethodInfo genericMethod= mesthod.MakeGenericMethod(model.GetType());
 dynamic sameEntitiesInContext = genericMethod.Invoke(this, new object[] { myList, model });

很簡單:

public static class DynamicLinqExtensions
{
    public static IEnumerable<TSource> FilterByUniqueProp<TSource>
            (this IEnumerable<TSource> query, TSource model)
    {
        // Do something accourding to this type
        var type = typeof(TSource);
        return null;
    }

    public static IEnumerable<TSource> FilterByUniqueProp2<TSource>
            (this IEnumerable<object> query, TSource model)
    {
        // We use Cast<>() to conver the IEnumerable<>
        return query.Cast<TSource>().FilterByUniqueProp<TSource>(model);
    }
}

您使用.Cast<>

像這樣使用它:

// Your data
IEnumerable<object> addedEntities = new object[] { new MyClass(), new MyClass() };
object model = new MyClass();

// The needed code
Type type = model.GetType();

MethodInfo method = typeof(DynamicLinqExtensions)
          .GetMethod("FilterByUniqueProp2")
          .MakeGenericMethod(type);

method.Invoke(null, new object[] { addedEntities, model });

請注意,實際上您可以直接將FilterByUniquePropr的簽名FilterByUniquePropr為:

public static IEnumerable<TSource> FilterByUniqueProp<TSource>
        (this IEnumerable<object> query, TSource model)
{
    var query2 = query.Cast<TSource>();

    var type = typeof(TSource);

    return null;
}

並使用反射來調用此方法!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM