为了创建一个通用的基类,我想把字段的类型存储在变量中。类似于这样的东西(这是行不通的)。
public class MyClass
{
public MyClass()
{
myType = typeof(string);
}
public Type myType { get; set; }
public myType MyProperty { get; set; }
}
我处理了很多模型和模型的ObservableCollections,这些模型来自一个数据库,有70多个表,我通过Entity Framework Core获得,我不想因为变化的类型而复制粘贴(DRY!)每个表的业务逻辑。
我想到的还有没有其他方法?
正如你所看到的,你所要做的根本不可能。一个类型为 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