有没有一种方法可以调用方法并且返回类型是强类型的?
有代码示例
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/