Answer-ID
  • Întrebări
  • Tag-uri
  • Categorii
Notificări
Recompense
Înregistrare
După înregistrare, veți primi notificări despre răspunsurile și comentariile la întrebările DVS.
Logare
Dacă aveţi deja un cont, autentificaţi-vă pentru a verifica notificările noi.
Aici vor fi recompensele pentru întrebările, răspunsurile și comentariile adăugate sau modificate.
Mai mult
Sursă
Editează
Rob Cooper
Rob Cooper

Tip Generic de conversie DIN șir

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!).

221 2008-08-12T09:13:23+00:00 10
Programare
c#
generics
type-safety
primitive
Comentarii la întrebare (3)
Soluția
lubos hasko
lubos hasko
12 august 2008 в 9:24
2008-08-12T09:24:33+00:00
Mai mult
Sursă
Editează
#8413516

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();}
    }
}
358
0
Comentarii (6)
Tim Coker
Tim Coker
2 decembrie 2009 в 2:11
2009-12-02T14:11:47+00:00
Mai mult
Sursă
Editează
#8413518

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)));
    }
}
69
0
Comentarii (4)
 dbkk
dbkk
12 august 2008 в 9:32
2008-08-12T09:32:06+00:00
Mai mult
Sursă
Editează
#8413517

Pentru mai multe tipuri (integer, double, DateTime, etc), există o Analiza statică metodă. Puteți invoca ajutorul de reflecție:


if (m != null)
{
    return m.Invoke(null, new object[] { base.Value });
}
13
0
Comentarii (0)
Dinesh Rathee
Dinesh Rathee
9 iulie 2013 в 11:26
2013-07-09T11:26:13+00:00
Mai mult
Sursă
Editează
#8413520

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.

6
0
Comentarii (1)
Greg Hewgill
Greg Hewgill
12 august 2008 в 9:23
2008-08-12T09:23:51+00:00
Mai mult
Sursă
Editează
#8413515

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.

3
0
Comentarii (1)
Bob C
Bob C
7 august 2015 в 5:53
2015-08-07T17:53:00+00:00
Mai mult
Sursă
Editează
#8413522

Verificați static poate fi nul.GetUnderlyingType.

  • În cazul în care tip de fond al sistemului este nul, atunci modelul parametru nu este Null, și putem folosi acest tip direct
  • Dacă-suport tip nu este null, atunci folosesc fond al sistemului de tip în conversie.

Pare 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");
}
2
0
Comentarii (0)
 Mastahh
Mastahh
17 decembrie 2010 в 2:51
2010-12-17T14:51:24+00:00
Mai mult
Sursă
Editează
#8413519
{
    public T TypedValue
    {
        get { return (T)(object)base.Value; }
        set { base.Value = value.ToString();}
    }
}

Eu folosesc de conversie prin intermediul unui obiect. Este un pic mai simplu.

0
0
Comentarii (2)
 anhoppe
anhoppe
3 iunie 2015 в 7:53
2015-06-03T07:53:13+00:00
Mai mult
Sursă
Editează
#8413521

Am folosit lobos răspuns și funcționează. Dar am avut o problema cu conversia camere duble, din cauza culturii setări. Așa că am adăugat

0
0
Comentarii (0)
Todd Menier
Todd Menier
7 august 2017 в 9:26
2017-08-07T21:26:54+00:00
Mai mult
Sursă
Editează
#8413523

Î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(); }
    }
}
0
0
Comentarii (0)
 Ghominejad
Ghominejad
13 martie 2019 в 8:00
2019-03-13T08:00:42+00:00
Mai mult
Sursă
Editează
#8413524

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(acest obiect de valoare) { întoarcere (T)de valoare.Conversia(typeof(T)); } } `` Exemple

``CSHARP string stringValue = null; int? intResult = stringValue.Converti<int?>();

int? intValue = null; var strResult = intValue.Converti(); ``

0
0
Comentarii (0)
Adăugati o întrebare
Categorii
Toate
Tehnologii
Cultură
Viață / Artă
Stiință
Profesii
Afaceri
ID
KO
RO
RU
© Answer-ID 2021
Sursă
https://stackoverflow.com
în cadrul licenței cc by-sa 3.0 cu atribuire