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

her*_*ken 0 c# entity-framework-core .net-core c#-8.0

为了创建一个通用基类,我希望将字段的类型存储在变量中。像这样的东西(这不起作用):

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

        public Type myType { get; set; }

        public myType MyProperty { get; set; }
    }

Run Code Online (Sandbox Code Playgroud)

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

我想出的方法还有另一种方法吗?

pin*_*x33 5

正如您所看到的,您尝试做的事情根本不可能。一个类型的变量Type不能用来声明另一个变量。(这同样适用于字段、属性等)。您正在寻找的称为泛型,特别是泛型类。使用泛型类时,您的代码如下所示:

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

在上面的示例中,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!";
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

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