Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
ostrozan
Tvůrce
Avatar
ostrozan:27.6.2014 9:19

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
Nahoru Odpovědět
27.6.2014 9:27
https://www.facebook.com/peasantsandcastles/
Avatar
coells
Tvůrce
Avatar
Odpovídá na ostrozan
coells:27.6.2014 11:10

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
Tvůrce
Avatar
Odpovídá na coells
ostrozan:27.6.2014 11:20

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ý
Tvůrce
Avatar
Odpovídá na ostrozan
Jan Vargovský:27.6.2014 12:44

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
Tvůrce
Avatar
Odpovídá na Jan Vargovský
ostrozan:28.6.2014 15:58

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ý
Tvůrce
Avatar
Odpovídá na ostrozan
Jan Vargovský:28.6.2014 17:45

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.