C# 在运行时返回没有类型参数的泛型类型

标签 c# generics return

是否可以返回一个类型的对象

 IModel< T >

不知道类型参数?

对象存储在字典中,以 Type 为键,对象以 IModel 为键。 (IModel<T> 的基本接口(interface))实现为一个值。 界面IModel<T>继承自 IModel , 但要执行完整操作,我需要一个 IModel<T> 的对象. T需要有接口(interface) IFactoryItem .

但首先是代码:

    public IModel<T> GetModel<T>() where T : IFactoryItem
    {
         Type tmpType  = typeof(T);
         if (!_allModelsByType.ContainsKey(tmpType))
                return null;

         return (IModel<T>)_allModelsByType[tmpType];
    }

我想到了一个解决方案

public IModel GetModel(Type t) 和将其转换为正确类型的包装器。

我希望我没有完全错。 这是我的第一个问题。

最佳答案

如果您的问题是如何返回 IModel<T> 的实例但你不知道什么T是在编译时,只是它总是派生自 IFactoryItem然后:

如果你不使用 T在方法输入中,和 T是一个可以使用协方差的类:

public interface IModel<out T> where T : class
{
    T Value { get; }
}

public class Model<T> : IModel<T> where T : class
{
    public T Value { get; set; }
}


class Program
{
    static void Main(string[] args)
    {
        var foo = new Model<string>()
        {
            Value = "hello world",
        };

        IModel<object> boo = foo;

        Console.WriteLine(boo.Value);
    }
}

这样你就可以绕过IModel<IFactoryItem>而不是 IModel<T>

如果您需要值类型,或者您不能使用协变,那么理想情况下您将拥有(如您所建议的)第二个非通用接口(interface) IModel将任何值公开为 object

public interface IModel
{
    object Value { get; }
}

public class Model<T> : IModel, IModel<T> 
{
    public T Value { get; set; }
    object IModel.Value => Value;
}

如果您的问题是如何创建 Model<T> 的实例当你只知道运行时的类型时,它是:

 var someType = typeof (SomeFactoryItem);
 var instance = Activator.CreateInstance(typeof (Model<>).MakeGenericType(someType));

您仍然需要返回 IModel或者,如果你可以使用协方差,IModel<IFactoryItem>

关于C# 在运行时返回没有类型参数的泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35164204/

相关文章:

c++ - 函数返回一个数组

c# - 如何在 DynamoDB 中的扫描中选择嵌套属性?

java - 在此接口(interface)定义中,尖括号是什么意思?

java - yield 增加后 : How are They Implemented?

c# - 用于类型推断的通用身份函数

java - 这个菱形符号的解释?

python - Words.txt 文件中有多少个单词的元音字母为 a e i o u 按顺序排列?

c# - ScriptManager.GetCurrent 方法背后的原因

c# - 用 MySQL 数据填充 Datagridview

C# HTTP 请求解析器