gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:23:15 25 4
gpt4 key购买 nike

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

有代码示例

 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com