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."
C# - Problemi i rješenja
- poruka: 2.151
- |
- čitano: 652.233
- |
- moderatori:
Lazarus Long, XXX-Man, vincimus
Hvala, nadosao sam i ja. bunilo me malo klasa Type jer ima i metoda GetType("System.string") ali dobro je vazno da sam skontao hvala.
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();
}
}
}
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
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!
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 :)
Stavi tu kôd pa će se valjda netko već javiti. Iako ne kužim kako znaš da imaš 3 greške, ali ih ne možeš pronaći
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; }
}
}
}
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"
}
}
Hvala, ali je problem jel imam par milijuna linija a ne samo jednu, tak da to nemogu izbaciti.
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.
Prikazani JSON ne sadrži Wifi, nego Rootobject pa možeš deserijalizirati njega:
...
Rootobject rootobject = JsonConvert.DeserializeObject<Rootobject>(json);
Console.WriteLine(rootobject.WiFi.SSID);
DeserializeObject<Rootobject>(json);
i radit će ti.
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
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();
}
Zašto koristiš prazan try-catch?
Zato sto mi određeni stringovi nisu u dobrom formatu te hocu preskociti te greske.
Onda preporučam da hvataš samo te JSON greške. Moguće da imaš problem s pisanjem kojeg prazan catch maskira.
Nije do toga, jel kad rucno mjenjam id gore sve normalno prode. I sad sam stavio
Newtonsoft.Json.JsonReaderException
u catch i ista stvar se događa
Probaj sa for i vidi dal će ti radit.
Zašto koristiš toliko stream writer-a?
Probo sam vec, ista stvar. A streamwritere koristim jel jedino tak znam radit ispis u 6 razlicitih filova. Al nema veze riješio sam ja to vec sve rucno, ionako mi je ovo trebalo za one time thing.
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.
EDIT: da sam prije pito prije bi skuzio, ali zanimljivo kak Convert.ToDouble zanemari tocku dok new PointLatLng vidi tocku.
Rekao bi da te zafrkava točka, jer ti je OS na hr settingsima pa je decimalni separator zarez.
baci oko na https://dotnetfiddle.net/PiPWAV
Convert.ToDouble("10.5", new CultureInfo("en"))
da to je bio problem, radi sa
Convert.ToDouble(value2, System.Globalization.CultureInfo.InvariantCulture);
probo sam prije toga i sa zarezom i isto ne prepoznaje separator, stvarno cudno
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.
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.
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).
Pozdrav ekipa, treba mi mala pomoc
Napravio sam winform aplikaciju i preko publisha instaliram na racunalu i sve radi normalno
I sad zelim aplikaciju prebaciti na drugo racunalo , al ne zeli da je pokrene, a na racunalu kojem sam radio aplikaciju sve normalno radi. I uz navedeni problem ,kako cu ja namjestit connection string sql servera od drugog racunala ako na njemu nemam visual studio
Pozdrav ekipa, treba mi mala pomoc
Napravio sam winform aplikaciju i preko publisha instaliram na racunalu i sve radi normalno
I sad zelim aplikaciju prebaciti na drugo racunalo , al ne zeli da je pokrene, a na racunalu kojem sam radio aplikaciju sve normalno radi. I uz navedeni problem ,kako cu ja namjestit connection string sql servera od drugog racunala ako na njemu nemam visual studio
Pa trebao bi na neki način biti u mogućnosti promijeniti takve parametre. Možda preko config file-a?