如何在不知道T

时间:2019-09-04 05:29:23

标签: c# generics

我从var pi = propertyInfo.GetValue(instance)获取变量 这是object类型。我知道这一切的结果都是类型的 ObjectSet<TEntity>。我不知道TEntityTEntity总是不同。

使用功能看起来很像

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;
}

2 个答案:

答案 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>());