Programiranje

C# - Problemi i rješenja

dedspace ned 24.2.2019 19:35

Pozdrav. imam problem treba da uradim jedan zadatak uz pomoc refleksije u c# a ne mogu nikako da ga uradim ako moze ko da mi pomogne .

"Korišćenjem refleksije, potrebno je ispitati osobine .NET klase String. Potrebno je prikazati naziv klase, njen prostor imena, naziv sklopa u kome se nalazi, tip koji nasleđuje, interfejse koje implementira, kao i osnovne informacije o tome da li je klasa apstraktna, zapečaćena, generička itd."

dedspace ned 24.2.2019 23:32

Pozdrav imam jos jedno pitanje, treba da dinamicki napravim klasu i da iskoristim metodu medjutim ne uspjeva mi prilikom dinamickog pozivanja metode ako moze neko pomoci ? ov je sto sam do sada uspjeo da odradim i tu sam udario u zid..

 

namespace Dinamickokreiranjetipova
{
    class Country
    {
        public string Name { get; set; }
        public int Population { get; set; }
        public Country (string name, int population)
        {
            Name = name;
            Population = population;
        }
        public string GetCountryInfo()
        {
            return "Country " + Name + " has the population of " + Population + ".";
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Assembly assembly = null;
            try
            {
                assembly = Assembly.Load("Dinamickokreiranjetipova");
            }
            catch (FileNotFoundException exc)
            {

                Console.WriteLine(exc.Message);
            }

            Type country = assembly.GetType("Dinamickokreiranjetipova.Country");
            object obj = Activator.CreateInstance(country,new object[] {"Afrika",1 });
            Console.WriteLine($"Novi tip kreiran dinamicki: {obj}");

            MethodInfo methodInfo = country.GetMethod("GetCountryInfo");

            methodInfo.Invoke(obj);

            Console.ReadLine();
        }
    }
}

Sevic13 pon 25.2.2019 22:41

Pozdrav,

 

znači skoro si tamo.

Metoda .Invoke prima dva paramtera, objekt na kojem se pokušava izvršiti i polje parametara tipa "object" koji mora odgovarati broju i tipu parametara koje metoda koja se poziva prima.

Metoda koju ti pokušavaš pozvati ne prima paramtere pa možeš proslijediti prazno polje tipa "object".

 

            ...
            MethodInfo methodInfo = country.GetMethod("GetCountryInfo");

            object[] parameters = new object[]{}; //Stvoriš prazno polje i proslijediš ga kao drugi parametar u poziv metode.

            methodInfo.Invoke(obj, parameters); // Ne zaboravi ovaj poziv staviti u Console.WriteLine() jer metoda koju pozivaš vraća string pa ako to ne napraviš nećeš ništa dobiti na konzoli.
            ...

 

Pozdrav

 

crolux pon 6.5.2019 14:49

Pozdrav ekipa, trebam pomoc oko zadatka koji smo dobili. Radi se u grafickom sucelju unutar C#
Voljan sam sjesti preko Discorda, TS3, Skype, bilo cega,  i raditi na ovom seminaru koliko god treba uz pomoc. Do sada smo prosli kroz nekakve osnove rada sa matricama, datotekama i na zadnjim vježbama sa Windows Forms app (graficko sucelje). Do ove godine na seminarima nije bilo grafickih sucelja pa nitko iz visih godina ne moze/zeli pomoci. 
EDIT: Zadatak je rijesen uz pomoc jednog forumaša koji je htio ostati anoniman. Hvala! 

Rolac pon 20.5.2019 16:05

Pozdrav,

 

Da li ima netko volje mi pročešljat kratki kontroler i popravit ili makar uočit 3 greškice koje ne mogu pronači...Radi se o C# .net jednostavnoj web aplikaciji. To mi je prva aplikacija u .netu te bio puno zahvalan na pomoći :)

R4zOR229 sri 29.5.2019 20:03

Oce mi neko objasnit sta krivo radim, ne ispise mi se nista. Znaci pokusavam lodat JSON i spremit ga kao objekt.

 

Ovdje je linije koda iz fila

{
  "WiFi": {
    "SSID": "MyCharterWiFi83-2G",
    "BSSID": "c4:04:15:0e:c0:83",
    "capabilities": "[WPA2-PSK-CCMP][WPS][ESS]",
    "level": "-38",
    "frequency": "2462",
    "time": "Saturday, November 1, 2014 12:01:38 AM Pacific Daylight Time"
  }
}

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using System.IO;

namespace wifi
{
    class Program
    {

        static void Main(string[] args)
        {
            string json = File.ReadAllText(@"primjer.txt");
            Wifi wifi = JsonConvert.DeserializeObject<Wifi>(json);
            Console.WriteLine(wifi.SSID);
            Console.Read();
        }

        public class Rootobject
        {
            public Wifi WiFi { get; set; }

        }

        public class Wifi
        {
            public string SSID { get; set; }
            public string BSSID { get; set; }
            public string capabilities { get; set; }
            public string level { get; set; }
            public string frequency { get; set; }
            public string time { get; set; }
        }

    }
}

Beno čet 30.5.2019 09:52

Ako ti kontroliras JSON file, izbaci "WiFi {}" i radit ce taj kod

 

{
 "WiFi": {
    "SSID": "MyCharterWiFi83-2G",
    "BSSID": "c4:04:15:0e:c0:83",
    "capabilities": "[WPA2-PSK-CCMP][WPS][ESS]",
    "level": "-38",
    "frequency": "2462",
    "time": "Saturday, November 1, 2014 12:01:38 AM Pacific Daylight Time"
  }
}

fighterZu čet 30.5.2019 22:44
R4zOR229 kaže...

Hvala, ali je problem jel imam par milijuna linija a ne samo jednu, tak da to nemogu izbaciti.

 Ponavlja ti se negdje "WiFi" key u json-u ili je on jedinstven?

 

Ako je jedinstven možeš probati sa dictionary opcijom

https://www.newtonsoft.com/json/help/html/DeserializeDictionary.htm

 

Isto tako ako je riječ o stvarno kompleksnom jsonu možda je puno bolja deserijalizacija samo dijela jsona koji ti treba

https://www.newtonsoft.com/json/help/html/SerializingJSONFragments.htm

 

Kolega ispod je naveo najispravnije rješenje ukoliko je json ovakve strukture kakvu si naveo. Pretpostavljam da ti { prije "WiFi" key-a predstavlja početak cijeloga json-a, a ne vrijednost nekoga atributa koji je dio toga korijena. 

Bobobo-bo Bo-bobo čet 30.5.2019 22:58

Prikazani JSON ne sadrži Wifi, nego Rootobject pa možeš deserijalizirati njega:

 

...
            Rootobject rootobject = JsonConvert.DeserializeObject<Rootobject>(json);
            Console.WriteLine(rootobject.WiFi.SSID);

R4zOR229 sub 1.6.2019 13:34

Hvala, ljudi evo sve je radilo. Sad imam jedan drugi problem, neki od logova nevaljaju, i za to sam siguran jel kad sam ih probao konvertirati u excel izbacilo je grešku, tako da sam siguran da je do njih a ne do koda(drugi radi sasvim normalno). Error koji mi izbaci je

 

-      ReadTimeout   'file.BaseStream.ReadTimeout' threw an exception of type 'System.InvalidOperationException'   int {System.InvalidOperationException}

 

Sad ja bi jednostavno preskocio string koji baca taj error ukoliko je to moguće, može čak i cijeli file. Ispod je kod makar kao što sam reko nije do koda sigurno

 

 static void Main(string[] args)
        {
            int counter = 0;
            string line;
           

            // Read the file and display it line by line.  
            System.IO.StreamReader file =
                new System.IO.StreamReader(@"log_11-1-2014.txt");
            while ((line = file.ReadLine()) != null)
            {
      
                if (line.StartsWith("{\"WiFi"))
                {
                    Rootobject rootobject = JsonConvert.DeserializeObject<Rootobject>(line);
                    Console.WriteLine(rootobject.WiFi.SSID);
                    Console.WriteLine(rootobject.WiFi.BSSID);
                    counter++;
                }
            }
 

            file.Close();
            Console.WriteLine("There were {0} lines.", counter);
            // Suspend the screen.  
            Console.ReadLine();
        }

        public class Rootobject
        {
            public Wifi WiFi { get; set; }

        }

        public class Wifi
        {
            public string SSID { get; set; }
            public string BSSID { get; set; }
            public string capabilities { get; set; }
            public string level { get; set; }
            public string frequency { get; set; }
            public string time { get; set; }
        }

    }

 

EDIT:riješio, bilo je jednostavnije nego šta sam mislio :D

R4zOR229 sub 1.6.2019 18:29

Opet ja :) , zanima me jel mogu ovdje dodat nesto sto bi mi mjenjalo ovaj string(vremenska zona) tj. ignoriralo bi ga. Jel kad njega nema radi sve ok, a i nije mi potreban

 

            string s = "Saturday, November 1, 2014 12:01:38 AM Pacific Daylight Time";
            var date = DateTime.ParseExact(s, "dddd, MMMM d, yyyy hh:mm:ss tt", CultureInfo.InvariantCulture);
            Console.WriteLine(date);
            Console.ReadKey();

 

Da budem precizniji na sto ciljam, ko kad u SQL upitu napisem '%' di mi % mjenja bilo koje charove, naravno ako je takvo što uopce moguce ovdje.

 

EDIT: Jos jedna stvar, nije mi ovdje jasno šta krivo radim. Znaci problem je u ovoj vanjskoj petlji izvrsi mi se samo za id=1

       static void Main(string[] args)
        {

            int id = 1;
           while (id <= 35)
            {
                int counter = 1;
                string line;
                System.IO.StreamReader file =
                new System.IO.StreamReader(@"C:path" + id + ".txt");
                StreamWriter SWifi = new StreamWriter(@"C:path" + id + ".txt");
                StreamWriter SBlue = new StreamWriter(@"C:path" + id + ".txt");
                StreamWriter SApp = new StreamWriter(@"C:path" + id + ".txt");
                StreamWriter SAct = new StreamWriter(@"C:path" + id + ".txt");
                StreamWriter SCall = new StreamWriter(@"C:path" + id + ".txt");
                StreamWriter SSMS = new StreamWriter(@"C:path" + id + ".txt");
                StreamWriter SLoc = new StreamWriter(@"C:path" + id + ".txt");

                while ((line = file.ReadLine()) != null)
                {

                    if (line.StartsWith("{\"WiFi"))
                    {
                        try
                        {
                            Rootobject rootobject = JsonConvert.DeserializeObject<Rootobject>(line);
                            SWifi.WriteLine(id + " | " + rootobject.WiFi.SSID + "|" + rootobject.WiFi.BSSID + "|" + rootobject.WiFi.capabilities + "|" + rootobject.WiFi.level + "|" + rootobject.WiFi.frequency);
                            counter++;
                        }
                        catch
                        { }
                    }
                    if (line.StartsWith("{\"Bluetooth"))
                    {
                        try
                        {
                            Rootobject rootobject = JsonConvert.DeserializeObject<Rootobject>(line);
                            SBlue.WriteLine(id + " | " + rootobject.Bluetooth.name + "|" + rootobject.Bluetooth.address + "|" + rootobject.Bluetooth.bondstatus);
                            counter++;
                        }
                        catch
                        { }
                    }
                    if (line.StartsWith("{\"Application"))
                    {
                        try
                        {
                            Rootobject rootobject = JsonConvert.DeserializeObject<Rootobject>(line);
                            SApp.WriteLine(id + " | " + rootobject.Application.ProcessName + "|" + rootobject.Application.Start + "|" + rootobject.Application.End);
                            counter++;
                        }
                        catch
                        { }
                    }
                    if (line.StartsWith("{\"Activity"))
                    {
                        try
                        {
                            Rootobject rootobject = JsonConvert.DeserializeObject<Rootobject>(line);
                            SAct.WriteLine(id + " | " + rootobject.Activity.start + "|" + rootobject.Activity.end + "|" + rootobject.Activity.type + "|" + rootobject.Activity.condfidence);
                            counter++;
                        }
                        catch
                        { }
                    }
                    if (line.StartsWith("{\"Call"))
                    {
                        try
                        {
                            Rootobject rootobject = JsonConvert.DeserializeObject<Rootobject>(line);
                            SCall.WriteLine(id + " | " + rootobject.Call.Number + "|" + rootobject.Call.Duration + "|" + rootobject.Call.Time);
                            counter++;
                        }
                        catch
                        { }
                    }
                    if (line.StartsWith("{\"SMS"))
                    {
                        try
                        {
                            Rootobject rootobject = JsonConvert.DeserializeObject<Rootobject>(line);
                            SSMS.WriteLine(id + " | " + rootobject.SMS.Address + "|" + rootobject.SMS.date);
                            counter++;
                        }
                        catch
                        { }
                    }
                    if (line.StartsWith("{\"Location"))
                    {
                        try
                        {
                            Rootobject rootobject = JsonConvert.DeserializeObject<Rootobject>(line);
                            SLoc.WriteLine(id + " | " + rootobject.Location.Latitude + "|" + rootobject.Location.Longtitude + "|" + rootobject.Location.Altitude + "|" + rootobject.Location.time + "|" + rootobject.Location.Accuracy + "|" + rootobject.Location.Provider + "|" + rootobject.Location.Speed);
                            counter++;
                        }
                        catch
                        { }
                    }

                   
                }
               id++;
                SWifi.Close();
                SBlue.Close();
                file.Close();
                Console.WriteLine("There were {0} lines.", counter);
                Console.ReadLine();
               

            }

R4zOR229 čet 20.6.2019 22:48

Opet ja xD, imam problem sa formatom double brojeva kad ih ubacujem u listu. Znaci kad ih je rucno ubacim

 

List<PointLatLng> points = new List<PointLatLng>();

            points.Add(new PointLatLng(35.8116039, 51.4158236));
            points.Add(new PointLatLng(35.8116491, 51.4159306));
            points.Add(new PointLatLng(35.8118829, 51.4158089));
            points.Add(new PointLatLng(35.8118829, 51.4158089));

 

Sve radi ok i nacrta mi poligone, ali kad ubacujem ovako iz sql querya ne dobivam nista

 

            {
                using (var reader = sqlCommand.ExecuteReader())

                {
                    while (reader.Read())
                    {

                        string value1 = reader.GetString(0);
                        string value2 = reader.GetString(1);
                        double val = Convert.ToDouble(value1);
                        double val2 = Convert.ToDouble(value2);
                        points.Add(new PointLatLng(val, val2));



                    }
                }
            }

 

Na slici se vidi razlika izmedu tih dviju vrsta inputa, a to je sta kad ubacujem preko petlje gubim tocku tako da pretpostavljam da zbog toga ne radi. Ali

points.Add(new PointLatLng());

me trazi double za input, i onda gubim tu tocku, pa ako neko zna nek me prosvjetli

 

EDIT: da sam prije pito prije bi skuzio, ali zanimljivo kak Convert.ToDouble zanemari tocku dok new PointLatLng vidi tocku.

 

 

Boky Milanovic čet 25.7.2019 14:14

Lijep pozdrav svima, da ne otvaram novu temu postaviću pitanje ovdje.

Kako najefikasnije izvršiti metod specifikovan u MethodInfo klasi bez da znate njegove parametre (Parameters) i tip podatka koji vraća kao rezultat (Return Type) u momentu pisanja koda (At Compile Time)?

Pod terminom efikasno podrazumjevam da performanse prilikom velikog broja izvršavanja budu što bliže pozivu klasičnog (Native) metoda.

pr0n_addict čet 25.7.2019 15:33
Boky Milanovic kaže...

Lijep pozdrav svima, da ne otvaram novu temu postaviću pitanje ovdje.

Kako najefikasnije izvršiti metod specifikovan u MethodInfo klasi bez da znate njegove parametre (Parameters) i tip podatka koji vraća kao rezultat (Return Type) u momentu pisanja koda (At Compile Time)?

Pod terminom efikasno podrazumjevam da performanse prilikom velikog broja izvršavanja budu što bliže pozivu klasičnog (Native) metoda.

Probaj se poigrati s ovim.

Boky Milanovic pet 26.7.2019 12:53
pr0n_addict kaže...
Boky Milanovic kaže...

Probaj se poigrati s ovim.

Hvala, i sam sam počeo eksperimentisati sa navedenim, performanse i nisu tako loše pod uslovom da inline opcija bude isključena (da se dobiju stvarni rezultati poziva).

Ipak, performanse su mnogo lošije dodavanjem parametara tipa "object" (zbog boxing/unboxing overheda), a ipak to je jedini način koji sam ja pronašao da izvršim potiv (i napravim keširanje funkcije) o kojoj u trentku pisanja koda ne znam ništa (niti tipove argumenata, niti izlazni tip podatka).

Performanse dodavanjem "object" parametara su čak 15x lošije u odnosu na poziv klasične funkcije prilikom mog jednostavnog testa (za mjerenje vremena korišten Stopwatch, korištena funckija "Math.Max" sa int32 parametrima - koji maksimiziraju efekat boxing/unboxing-a).