Am o clasa care vreau să o folosesc pentru a stoca "proprietăți" pentru o altă clasă. Aceste proprietăți au pur și simplu un nume și o valoare. În mod ideal, ceea ce aș dori este să fie în măsură să adăugați typed proprietăți, așa că "valoarea" returnat este întotdeauna de tip care vreau să fie.
Tipul ar trebui să fie întotdeauna un primitiv. Această clasă subclase o clasă abstractă care, practic, magazinele numele și valoare ca și șir de caractere. Ideea fiind că această subclasă va adăuga unele de tip siguranța la clasa de baza (precum și a mă salva pe unii de conversie).
Deci, am creat o clasa care este (aproximativ) asta:
{
public DataType TypedValue
{
get { // Having problems here! }
set { base.Value = value.ToString();}
}
}
Deci, întrebarea este:
* Există o "generic" mod de a converti de la coarda la un primitiv?**
Pot't par să găsească orice generic interfață, care link-uri de conversie peste bord (ceva de genul ITryParsable ar fi fost ideal!).
Nu sunt sigur dacă am înțeles corect intențiile, dar las's a vedea dacă acesta ajută.
{
public T TypedValue
{
get { return (T)Convert.ChangeType(base.Value, typeof(T)); }
set { base.Value = value.ToString();}
}
}
lubos hasko's metoda eșuează pentru nullables. Metoda de mai jos va lucra pentru nullables. Am't să vină cu ea, deși. Am găsit-o prin intermediul Google: http://web.archive.org/web/20101214042641/http://dogaoztuzun.com/post/C-Generic-Type-Conversion.aspx Credit pentru a "Ton Toksoz"
Utilizare prima:
Clasa este mai jos.
{
public static T ChangeType<T>(object value)
{
return (T)ChangeType(typeof(T), value);
}
public static object ChangeType(Type t, object value)
{
TypeConverter tc = TypeDescriptor.GetConverter(t);
return tc.ConvertFrom(value);
}
public static void RegisterTypeConverter<T, TC>() where TC : TypeConverter
{
TypeDescriptor.AddAttributes(typeof(T), new TypeConverterAttribute(typeof(TC)));
}
}
TypeDescriptor
este clasa a avea metoda GetConvertor
care accepta un " Tip "object și apoi puteți suna ConvertFrom` metoda de a converti "valoare" pentru că obiectul specificat.
Ai putea folosi, eventual, un construct precum trăsături clasa. În acest fel, ar avea o parametrizat helper class care știe cum de a converti un șir de caractere la o valoare de propriul său tip. Apoi getter ar putea arata astfel:
Acum, trebuie să subliniez faptul că experiența mea cu parametrizat tipuri este limitată la C++ și template-uri, dar îmi imaginez că există o modalitate de a face același lucru folosind C# generice.
Verificați static poate fi nul.GetUnderlyingType
.
Null
, și putem folosi acest tip directPare să funcționeze pentru mine:
{
// Test for Nullable<T> and return the base type instead:
Type undertype = Nullable.GetUnderlyingType(_t);
Type basetype = undertype == null ? _t : undertype;
return Convert.ChangeType(_toparse, basetype);
}
public T Get<T>(string _key)
{
return (T)Get(_key, typeof(T));
}
public void test()
{
int x = Get<int>("14");
int? nx = Get<Nullable<int>>("14");
}
Încă o altă variantă. Mânere Nullables, precum și situațiile în care șirul este nulă și T nu este null.
{
public T TypedValue
{
get
{
if (base.Value == null) return default(T);
var type = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T);
return (T)Convert.ChangeType(base.Value, type);
}
set { base.Value = value.ToString(); }
}
}
Cu inspirație de la Bob's a răspunde, aceste extensii sprijini, de asemenea, null valoarea de conversie și toate primitiv de conversie a întors și a patra.
``CSHARP public static class ConversionExtensions { public static object Converti(acest obiect de valoare, de Tip t) { Tip underlyingType = Null.GetUnderlyingType(t);
dacă (underlyingType != null && valoare == null) { return null; } Tip basetype = underlyingType == null ? t : underlyingType; Sistemul de returnare.Converti.ChangeType(valoare, basetype); }
public static T Converti
``CSHARP string stringValue = null; int? intResult = stringValue.Converti<int?>();
int? intValue = null;
var strResult = intValue.Converti