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

问题描述 投票:0回答:1

为了创建一个通用的基类,我想把字段的类型存储在变量中。类似于这样的东西(这是行不通的)。

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

        public Type myType { get; set; }

        public myType MyProperty { get; set; }
    }

我处理了很多模型和模型的ObservableCollections,这些模型来自一个数据库,有70多个表,我通过Entity Framework Core获得,我不想因为变化的类型而复制粘贴(DRY!)每个表的业务逻辑。

我想到的还有没有其他方法?

c# .net-core entity-framework-core c#-8.0
1个回答
4
投票

正如你所看到的,你所要做的根本不可能。一个类型为 Type 不能用于声明另一个变量。这同样适用于字段、属性等)。你正在寻找的是所谓的 非专利产品具体来说 通用类. 下面是你的代码在使用通用类时的样子。

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

类型参数在整个类中保持一致。它可以出现在属性、字段、返回类型和方法参数中。一个类也可以有多个类型参数。另外。方法 可以指定通用参数,不管它们所包含的类本身是否是通用的。

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

* 有 一些 不能作为通用参数使用的类型,例如 ref structs

© www.soinside.com 2019 - 2024. All rights reserved.