【问题标题】:Storing type in variable to declare properties将类型存储在变量中以声明属性
【发布时间】:2020-05-18 08:08:18
【问题描述】:

要创建通用基类,我希望将字段的类型存储在变量中。像这样的东西(这只是行不通):

    public class MyClass
    {
        public MyClass()
        {
            myType = typeof(string);
        }

        public Type myType { get; set; }

        public myType MyProperty { get; set; }
    }

我从一个数据库中处理大量模型和模型的 ObservableCollections,其中包含通过 Entity Framework Core 获得的 70 多个表,我不想复制/粘贴(DRY!)每个表的业务逻辑只是因为变化的类型。

我想出的还有其他方法吗?

【问题讨论】:

  • class MyClass<T> { ... public T MyProperty { get; set; } }。又名generics
  • 您将无法声明public myType MyProperty,这不仅仅是因为特定的语法不正确,也无法像这样指定类型运行时。您要么必须切换到通用类,如 @Cid 所示,要么使用 objectdynamic 作为实际属性类型,这并不理想。

标签: c# .net-core entity-framework-core c#-8.0


【解决方案1】:

如您所见,您尝试做的事情根本不可能。 Type 类型的变量不能用于声明另一个变量。 (这同样适用于字段、属性等)。您要查找的内容称为Generics,特别是generic classes。以下是使用泛型类的代码:

public class MyClass<T>
{
   public T MyProperty { get; set; } 
   public Type TypeOfT => typeof(T); // for demo
}

在上面的示例中,T(称为泛型类型参数)是一种占位符。它可以替换为任何*类/结构/接口。这是在您创建该类型的新实例时完成的:

var objInt = new MyClass<int>();
Console.WriteLine(objInt.TypeOfT.Name); // System.Int32
objInt.MyProperty = 5;

var objString = new MyClass<string>();
Console.WriteLine(objString.TypeOfT.Name); // System.String
objString.MyProperty = "Hello!";

它们甚至可以与其他泛型类型一起使用:

var obj = new MyClass<MyClass<string>>();
obj.MyProperty = new MyClass<string>();
obj.MyProperty.MyProperty = "World";
Console.WriteLine(obj.TypeOfT.Name); // MyClass`1
Console.WriteLine(obj.MyProperty.TypeOfT.Name); // System.String

类型参数在整个类中保持一致。它可以出现在属性、字段、返回类型和方法参数中。一个类也可以有多个类型参数。此外,methods 可以指定泛型参数,无论其包含的类本身是否是泛型的。

我建议继续阅读上述链接所指向的文档。泛型是一个相当大的话题——在这里无法做到公正。

* 有一些类型不能用作泛型参数,例如ref structs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 2017-12-31
    • 2018-09-23
    • 1970-01-01
    相关资源
    最近更新 更多