2009-12-08 25 views
2

有沒有辦法調用一個方法,返回類型是強類型?有沒有辦法調用一個通用的methodInfo?

有代碼

public static IQueryable<T> FilterVersion<T>(this Table<T> t, IVersionIndexFilter version) 
     where T : class 
    { 
     try 
     { 
     // Define the new type of my table 
     Type versionTableType = Type.GetType(typeof(T).AssemblyQualifiedName.Replace(typeof(T).FullName, string.Concat(typeof(T).FullName, VersionIndexTableExtensionName))); 
     // Get the method info generic with a custom helper 
     var getTableType = MethodInfoHelper.GetGenericMethod(typeof(DataContext), "GetTable", new Type[] { versionTableType }, new Type[] { }, typeof(Table<>).MakeGenericType(typeof(Table<>).GetGenericArguments()[0]), BindingFlags.Public | BindingFlags.Instance); 
     // Get the object with a invoke but invoke return object, i need he return a Table<vesrionTableType> 
     var joinTable = getTableType.Invoke(t.Context, null); 
     // Put my new object in anonymous class 
     var result = new { FromT = t, InnerT = joinTable }; 
     // Write the type of the property and is {System.Object InnerT} 
     Console.Write(result.GetType().GetProperty("InnerT")); 

} 

一個例子,我需要我的Console.Write(result.GetType().GetProperty("InnerT"));返回Table<versionTableType> 這是有辦法,我CAND做到這一點?任何建議?

還有就是我GetGenericMethod

public static MethodInfo GetGenericMethod(Type t, string name, Type[] genericArgTypes, Type[] argTypes, Type returnType, BindingFlags flags) 
    { 
     if (genericArgTypes == null) 
     { 
     genericArgTypes = new Type[] { }; 
     } 

     MethodInfo genericMethod = (from m in t.GetMethods(flags) 
            where m.Name == name 
            && m.GetGenericArguments().Length == genericArgTypes.Length 
            && m.GetParameters().Select(pi => pi.ParameterType.IsGenericType ? pi.ParameterType.GetGenericTypeDefinition() : pi.ParameterType).SequenceEqual(argTypes) && 
            (returnType == null || (m.ReturnType.IsGenericType ? m.ReturnType.GetGenericTypeDefinition() : m.ReturnType) == returnType) 
            select m).FirstOrDefault(); 

     if (genericMethod != null) 
     { 
     return genericMethod.MakeGenericMethod(genericArgTypes); 
     } 

     return null; 
    } 

我讓我的方法的信息一般正常。問題是當我分配給另一個屬性時,我的調用結果是一個對象。我需要強力型我的結果

編輯:這是一個好主意靜態方法CreateResult但沒有足夠的...還有就是我試圖用我的價值

NewExpression exResult = Expression.New(result.GetType().GetConstructor(new Type[] { t.GetType(), typeof(Table<>).MakeGenericType(versionTableType) }), new List<Expression>() { outer, inner }, result.GetType().GetProperty("FromT"), result.GetType().GetProperty("InnerT")); 

後做有錯誤我得到了嘗試該技術後

Argument type 'System.Data.Linq.Table`1[Nms.Media.Business.Manager.Data.Linq.ImageLibraryItemBinaryLocaleVersionIndex]' does not match the corresponding member type 'System.Object' 

感謝

回答

0

我自動解決我的解決方案,靈感來自Jon Skeet的答案。

我創建一個類通用

public class ConvertTable<TOuter, TInner> 
    where TInner : class 
    where TOuter : class 
    { 
    public TOuter FromT { get; set; } 
    public TInner InnerT { get; set; } 
    public ConvertTable(TOuter fromT, TInner innerT) 
    { 
     FromT = fromT; 
     InnerT = innerT; 
    } 
    } 
4

編輯:好的,因爲你的問題編輯它看起來像你已經調用MakeGenericMethod。好。

現在,一旦設法調用該方法,那麼就需要製作適當的匿名類型。我建議你創建一個泛型類型,並在泛型類型定義上使用Type.MakeGenericType,然後構造它的一個實例。或者,你可以有另一個強類型的泛型方法,並以類似的方式用反射來調用它。該方法可以使用匿名類型:

public object CreateResult<TTable, TJoin>(TTable t, TJoin joinTable) 
{ 
    return new { FromT = t, InnerT = joinTable }; 
} 

你可以打電話給你的通用MethodInfo幫手,使其更容易調用此方法。

+0

getTableType.MakeGenericMethod(versionTableType).Invoke ... doent的工作,因爲返回一個對象,而不是我喜歡的類型 – 2009-12-08 14:01:26

+0

它* *宣佈重返'object',但它實際上會返回正確的類型。只有在執行時才知道該類型,因此要使用正確的屬性類型構建匿名類型,則需要再次使用反射。 – 2009-12-08 14:04:53

+0

這是個好主意 – 2009-12-08 14:09:27

相關問題