簡體   English   中英

如何在不知道 T 的情況下將對象轉換為泛型類

[英]How to cast object to generic class without knowing T

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

您可以使用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函數的返回值存儲在正確類型的變量中。 因此,您需要將所有邏輯移到其中。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM