如何将调用返回的值转换为 IEnumerable<type>,其中类型是 T 类型的某个变量?



我有这样的情况,我想在另一个对象上调用一些泛型方法并获得IEnumerable结果。

private void SomeFunction(Type type)
{
     var method = context.GetType()
       .GetMethods()
       .FirstOrDefault(_ => _.Name == "GetStorage" && _.IsGenericMethod);
     var storage = getStorage.MakeGenericMethod(type)
                    .Invoke(context, new object[] {})
                    .AsEnumerable();
                    //Some magic needed here. Something like Cast<type>, 
                    //but type - variable
     //More code ...
}

有人能建议我如何解决这种情况吗。非常感谢。

我已经看到了这个和类似的问题:泛型方法调用的铸造结果?但他们并没有回答我的问题,当我不知道要转换到的类型,并且类型存储为变量时,如何做同样的事情。

我不能使SomeFunction成为一个通用方法,因为实际情况是我正在用System.Type迭代一些列表,并在每个元素上调用lambda(即SomeFunction

为了得到想要的东西,您需要做一些事情。你说你想要一个lambda,但这意味着你需要定义这个lambda,它是在一个你还不知道的类型上。您可以将lambda重新设计为一个接口。

此外,我发现定义一个完全符合我要求的泛型类要容易得多。通过反射创建这个类的实例,并且只有在那里,我才能以强类型的方式实现该类的其余部分。这消除了大多数地方的"不知道自己是什么类型的人"。

就像这样。首先,执行器接口:

public interface ISomeFunctionExecutor
{
    void Execute(SomeContext context);
}

然后是我需要在实体上实现的接口,可以说是lambda。

public interface IEntityWithSomeFunction
{
    void SomeFunction();
}

现在执行器的实现。

public class SomeFunctionExecutor<TType> : ISomeFunctionExecutor
{
    public void Execute(SomeContext context)
    {
        var data = context.GetStorage<TType>().Cast<IEntityWithSomeFunction>();
        foreach (var item in data)
        {
            item.SomeFunction();
        }
    }
}

最后,它的用法:

// Usage:
SomeContext context = new SomeContext();
Type type = typeof(SomeEntity);
var executorType = typeof(SomeFunctionExecutor<>).MakeGenericType(type);
var executor = Activator.CreateInstance(executorType) as ISomeFunctionExecutor;
if (executor != null)
{
    executor.Execute(context);
}

基本上,重点是:定义一个泛型类,在您知道类型的地方执行您需要执行的操作,并使用反射创建该类的实例。这比使用一个不知道类型的完整方法要容易得多。

相关内容

  • 没有找到相关文章

最新更新