假设我有以下类(class):
public class MyClass
{
public decimal myDecimal;
public string myString;
}
我想使用 DataRowExtensions 方法 Field<>
目前,我正在使用这样的类:
MyClass myClass = new MyClass();
myClass.myDecimal = row.Field<decimal>("MyDecimalColumnName");
myClass.myString = row.Field<string>("MyStringColumnName");
但是,如果我决定将 myDecimal 的类型更改为 decimal
以外的类型,我希望调用 row.Field
以反射(reflect)正确的数据。
我想要类似于以下语法的内容:
myClass.myDecimal = row.Field<typeof(myClass.myDecimal)>("MyDecimalColumnName");
这不会编译,而且我不知道如何使用 typeof
或 GetType()
来返回 decimal
,无论如何会被调用。
有没有办法做到这一点,或类似的东西?我认为这可以在编译时完成,因为类型是已知的,而且泛型是编译时构造的。
谢谢!
最佳答案
首先,请注意公共(public)字段通常是一个非常糟糕的主意;但如果我们假设这是一个私有(private)支持领域,这里有 2 个有趣的选择;
首先是利用泛型类型推断;这不适用于 return 类型,但适用于参数,因此您可以:
row.GetField("MyDecimalColumnName", out obj.someField);
那是哪里:
GetField<T>(string name, out T value);
另一个技巧是使用隐式运算符,即 GetField(string)
返回一个虚拟对象,该对象具有隐式转换运算符到几种类型,例如 int
, decimal
等,并在运算符中进行工作/转换。有点 hacky,但会工作 - 语法是:
myClass.myDecimal = row.Field("SomeColumn")
与:
SomeDummyType GetField(string name);
和 SomeDummyType
具有一个或多个隐式静态转换运算符。
但是! IMO 此处的最佳选项是使用 ORM 或微型 ORM 等工具为您加载值,并且不要使用 DataRow
完全没有。
另一个简单的选择就是老派:
myClass.myDecimal = (decimal)row["SomeColumn"];
我的意思是 - 是 .Field<T>
真的帮了你们那么大忙吗?您是否真的经常重构您的类,以至于值得为此担心?
关于c# - 使用字段指定泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9685982/