在变量中存储类型以声明属性

Storing type in variable to declare properties

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

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

        public Type myType { get; set; }

        public myType MyProperty { get; set; }
    }

我通过 Entity Framework 核心处理来自数据库的大量模型和模型的 ObservableCollections,其中包含超过 70 个 table,我不想 copy/paste(干!)每个 table 的业务逻辑只是因为更改的类型。

还有其他方法可以解决我的想法吗?

如您所见,您尝试做的事情根本不可能。 Type 类型的变量不能用于声明另一个变量。 (这同样适用于字段、属性等)。你要找的是Generics, specifically generic classes。这是您的代码使用通用 class:

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

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

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

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

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

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