在变量中存储类型以声明属性
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
创建通用基础 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