我从var pi = propertyInfo.GetValue(instance)
获取变量
这是object
类型。我知道这一切的结果都是类型的
ObjectSet<TEntity>
。我不知道TEntity
。 TEntity
总是不同。
使用功能看起来很像
BuildClassItem<T>(ObjectSet<T> entities, ... ) where T : class
如何将对象投射到ObjectSet?
我尝试过这个。但是我不知道T
public static ObjectSet<T> MyConvert<T>(object myInput) where T : class
{
return (ObjectSet<T>)myInput;
}
答案 0 :(得分:1)
您可以使用System.Linq.Expressions
来构造“蹦床”,这是对通用方法的调用。一旦进入该通用方法,就可以在需要讨论类型时自然地开始使用T
。在这里,我直接将BuildClassItem
用作蹦床的目标:
using System;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
namespace Exercise
{
class Program
{
static void Main(string[] args)
{
var obj = GetObjectSet();
//We know obj is an ObjectSet<T> for unknown T
var t = obj.GetType().GetGenericArguments()[0];
var parm = Expression.Parameter(typeof(object));
var objectSet = typeof(ObjectSet<>).MakeGenericType(t);
var method = typeof(Program).GetMethod("BuildClassItem", BindingFlags.Static | BindingFlags.NonPublic).MakeGenericMethod(t);
var trampoline = Expression.Lambda(
Expression.Call(null, method, Expression.Convert(parm,objectSet)), new[] {parm});
var dele = (Action<object>) trampoline.Compile();
dele(obj);
Console.WriteLine("Done");
Console.ReadLine();
}
static void BuildClassItem<T>(ObjectSet<T> entities) where T : class
{
Console.WriteLine("We made it!");
}
static object GetObjectSet()
{
return new ObjectSet<string>();
}
}
internal class ObjectSet<T> where T:class
{
}
}
如果您在找到类型T
和调用BuildClassItem
之间还有更多工作要做,您仍然希望将所有逻辑放在T
中的泛型方法中并构造一个void
调用它。您无法从通用方法外部“说出”类型的名称,因此无法将MyConvert
函数的返回值存储到正确类型的变量中。因此,您需要将所有逻辑移入其中。
答案 1 :(得分:0)
public class ObjectSet<T>
{
}
public static ObjectSet<T> MyConvert<T>(object myInput) where T : class
{
return (ObjectSet<T>)myInput;
}
这样调用:
ObjectSet<object> get = MyConvert<object>(new ObjectSet<object>());
我没有任何错误,那么您的情况有什么错误?
或
public class FOO
{
}
public interface IObjectSet
{
}
public class ObjectSet<T> : IObjectSet
{
}
IObjectSet get = MyConvert<FOO>(new ObjectSet<FOO>());