Diskuze: Určení - změna datového typu

C# .NET .NET (C# a Visual Basic) Určení - změna datového typu American English version English version

Avatar
ostrozan
Redaktor
Avatar
ostrozan:

nejde mi o přetypování ve smyslu:

short a;
int b

b=(int)a;

mám například třídu , která provádí matematické operace a obsahuje tři vlastnosti - dva operandy a výsledek operace a metodu vykonávající samotnou operaci

class Vypocet
    {
     public int A_val { get; set; }
     public int B_val { get; set; }
     public int Result { get; set; }





        public Vypocet()
        {

        }


        internal void vypocet()
        {

           //nejaké ty pocty
           Result=A_val+B_val;

        }

    }

v tomto příkladu mají vlastnosti typ int

jak to ale zařídit , aby třída pracovala s jakýmkoli hodnotovým typem - tedy jak nastavit datový typ vlastností, který bych třeba zadal v konstruktoru?

public Vypocet(Type typ)
        {

        }

dala by se třeba využít metoda:

Convert.ChangeType(A_val, TypeCode.Int16);

snažil jsem se prostudovat co ta metoda vlastně dělá, ale asi jsem to moc nepochopil

vím, že tohle není ono - taky to nedělá to co bych potřeboval, ale nic jiného mně zatím nenapadlo

public Vypocet(Type typ)
      {
          Convert.ChangeType(A_val, typ);
      }
Editováno 27.6.2014 9:19
 
Odpovědět 27.6.2014 9:19
Avatar
coells
Redaktor
Avatar
Odpovídá na ostrozan
coells:

Pokud bys chtěl použít tu svoji třídu přesně tak, jak je, tzn matematické operace na generickém typu, pak to v C# nelze jednoduše udělat. Obvykle se musí udělat if-if-if a otestovat typ, pak se zavolá kód, který odpovídá správnému typu.

 
Nahoru Odpovědět 27.6.2014 11:10
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na coells
ostrozan:

To už by snad bylo jednodušší vytvořit třídu pro každý typ zvlášť :)

 
Nahoru Odpovědět 27.6.2014 11:20
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na ostrozan
Jan Vargovský:

Můžeš zkusit dynamic

class M
{
    dynamic a;
    dynamic b;

    public M(dynamic a, dynamic b)
    {
        if (!IsAllowedType(a.GetType()))
            throw new ApplicationException("Not allowed type");
        this.a = a;
        this.b = b;
    }

    private bool IsAllowedType(Type t)
    {
        var allowed = new Type[] { typeof(Int16), typeof(Int32), typeof(Int64), typeof(decimal), typeof(double) };
        return allowed.Any(type => type == t);
    }

    public dynamic GetSum()
    {
        return a + b;
    }
}
 
Nahoru Odpovědět 27.6.2014 12:44
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na Jan Vargovský
ostrozan:

To je přesně ono - dík za tip :) přiznám se, dle zdejšího tutoriálu jsem nabyl dojmu,že C# tento typ-netyp nemá

Editováno 28.6.2014 15:59
 
Nahoru Odpovědět 28.6.2014 15:58
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na ostrozan
Jan Vargovský:

No C# je sám o sobě strongly-typed, ale kvůli některým věcem vymysleli i tohle (osobně jsem to nikdy nepoužil, akorát vím, že to existuje). Všechno řeší až runtime a tak nemáš k dispozici ani intellisense.

 
Nahoru Odpovědět 28.6.2014 17:45
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.