[英]Specify generics type using a field
假設我有以下課程:
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
的調用反映正確的數據。
我想要類似以下語法的內容:
myClass.myDecimal = row.Field<typeof(myClass.myDecimal)>("MyDecimalColumnName");
這不會編譯,而且我不知道如何使用typeof
或GetType()
僅返回decimal
,無論調用什么。
有沒有辦法做到這一點,或者類似的方法? 我認為這可以在編譯時完成,因為類型是已知的,並且由於泛型是編譯時的構造。
謝謝!
首先,請注意,公共領域通常是一個非常糟糕的主意; 但是,如果我們假設這是一個私人支持領域,那么這里有2個有趣的選項;
首先是利用通用類型推斷。 這不適用於返回類型,但適用於參數,因此您可以:
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或micro-ORM之類的工具為您加載值,而根本不使用DataRow
。
另一個簡單的選擇就是去老派:
myClass.myDecimal = (decimal)row["SomeColumn"];
我的意思是.Field<T>
真的對您有很大幫助? 您是否真的經常對類進行足夠的重構以至於值得為此擔心?
您可以使用反射來動態構造適當的通用方法:
MyClass myClass = new MyClass();
var myType = typeof(MyClass.myDecimal);
var myMethod = Type.GetType("System.Data.DataRowExtensions")
.GetMethod("Field", new[]{typeof(DataRow), typeof(string));
var genericMethod = myMethod.MakeGenericMethod(new[]{myType});
myClass.myDecimal = genericMethod.Invoke(row, new object[]{"MyDecimalColumnName"});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.