c# - 有没有办法调用通用的methodInfo?

标签 c# .net generics reflection

有没有一种方法可以调用方法并且返回类型是强类型的?

有代码示例

 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> 我有办法做到这一点吗?有什么建议吗?

这是我的 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'

谢谢

最佳答案

编辑:好的,由于您的问题编辑,看起来您已经在调用 MakeGenericMethod。很好。

现在,一旦您成功调用该方法,就需要创建适当的匿名类型。我建议您创建一个泛型类型并使用 Type.MakeGenericType在泛型类型定义上,然后构造它的实例。或者,您可以使用另一个强类型的泛型方法,并以类似的方式通过反射调用该方法。该方法可以使用匿名类型:

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

您可以调用通用 MethodInfo 帮助器以更轻松地调用它。

关于c# - 有没有办法调用通用的methodInfo?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1867085/

相关文章:

java - 如何在 java 中围绕 Map<K, V> 创建通用类

c# - 共享通用代码以了解引用类型的原因和效率影响

c# - 许多可选过滤器可用于缩小 SQL Server 中的结果范围

C# Windows 窗体设置所选索引组合框的值

c# - Solidworks API C#/VB.net 设置 Enum 属性

c# - 如何动态使用 Resources.resx 即动态添加新项目

.net - .NET 中的有序集合和无序集合有什么区别

.net - 如果定义了显式构造函数,dapper 能否处理在数据库中存储为 varchar 的枚举?

java - 需要帮助以避免类型转换

c# - 如何获取复选框的状态