Mat*_*hew 1 c# generics typeof datarow gettype
假设我有以下课程:
public class MyClass
{
public decimal myDecimal;
public string myString;
}
Run Code Online (Sandbox Code Playgroud)
我想使用DataRowExtensions方法Field <>
目前,我正在使用这样的类:
MyClass myClass = new MyClass();
myClass.myDecimal = row.Field<decimal>("MyDecimalColumnName");
myClass.myString = row.Field<string>("MyStringColumnName");
Run Code Online (Sandbox Code Playgroud)
但是,如果我决定将myDecimal的类型更改为其他类型decimal,我希望调用row.Field能够反映正确的数据.
我想要类似于以下语法的东西:
myClass.myDecimal = row.Field<typeof(myClass.myDecimal)>("MyDecimalColumnName");
Run Code Online (Sandbox Code Playgroud)
这不会编译,我不知道如何使用typeof或GetType()只返回decimal,无论调用什么.
有没有办法做到这一点,或类似的东西?我认为这可以在编译时完成,因为类型已经知道,并且因为泛型是编译时构造.
谢谢!
首先,请注意公共领域通常是一个非常糟糕的主意; 但如果我们假设这是一个私人支持领域,那么这里有两个有趣的选择;
首先是利用泛型类型推断; 这不适用于返回类型,但适用于参数,因此您可以:
row.GetField("MyDecimalColumnName", out obj.someField);
Run Code Online (Sandbox Code Playgroud)
那是:
GetField<T>(string name, out T value);
Run Code Online (Sandbox Code Playgroud)
另一个技巧是使用隐含的运营商,即已经GetField(string)返回具有隐式转换运营商的虚拟对象的几个类型,如int,decimal等,并做好操作人员的工作/转换.有点hacky,但会工作 - 语法将是:
myClass.myDecimal = row.Field("SomeColumn")
Run Code Online (Sandbox Code Playgroud)
有:
SomeDummyType GetField(string name);
Run Code Online (Sandbox Code Playgroud)
并且SomeDummyType有一个隐式静态转换运算符或几个.
然而!IMO 这里最好的选择是使用ORM或micro-ORM等工具为您加载值,而根本不使用DataRow.
另一个简单的选择是去老派:
myClass.myDecimal = (decimal)row["SomeColumn"];
Run Code Online (Sandbox Code Playgroud)
我的意思是 - 这.Field<T>真的对你有多大帮助吗?你真的经常重构你的课程,这值得担心吗?