[C#] Convert string data till variable data?

Permalänk
Medlem

[C#] Convert string data till variable data?

Tjo, har ett problem som jag aldrig ha behövt göra förut, men har nu kommit till det...

using System; public class Program { static int ID_ICON_EMPTY = 2; SomeObject object = new SomeObject(); void LoadFile() { // Do some loading stuff... // Convert the files string ID_ICON_EMPTY to it's value from the program, in this case 2. object.ID = ??? // <-- This is where i don't know how to achive this } void Print() { Console.WriteLine(object.ID); } } class SomeObject { int ID; } /* * File Data: * ... * ... * SomeObject.ID = ID_ICON_EMPTY */

Exempel kod för att visa vad jag vill göra, tänkte att det var lättare att visa än att förklara...
Någon som har en bra lösning på detta?

//AJL

Visa signatur

C#/MonoGame Fanatiker.
Pixel Artist & Game Developer

Permalänk
Medlem

Lägg dina ID i en enum och kika på Enum.Parse.

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Medlem

Du kan ju också testa med Int32.TryParse TryParse kommer att returnera en bool (true/false) för om det går att konvertera strängen till en int, det kan ju vara mer som en extra säkerhet så du inte måste hantera ett exception med Int32.Parse. Alternativt om du alltid vet att strängen kommer innehålla siffror så kan du även använda Convert.ToInt32

/Ullman

Permalänk
Avstängd

Är det typ en flatfil? Jag skulle separera deserializingen och användad av datat, mao

var dto = FlatFileMapper.Map<MyDto>(stringData); if(dto.NettingAmount < 0) //act on negative NettingAmount

Istället för typ

if(decimal.Parse(stringData.Substring(512, 20)) <0) //act on negative NettingAmount

Exempel två skapar massor med noise som tar fokus från domänen

Jag har skrivit en faltfils parser nyligen för mitt uppdrag, kan tyvärr inte lägga upp den då koden ägs av kunden men jag valde en Fluent synstax mappning istället för Attribute så att man slipper gödsla ner sina DTOer med tråkiga attribute, mao

FlatFileMapper.CreateMap<MyDto>() .Map(x => x.NettingAmount) .Length(10);

Istället för

public class MyDto { [FlatFileRecord(Length = 10)] public decimal NettingAmount { get; set; } }

För att uppnå första exemplet, använd Expressions,

public PropertyMapResult<TType, TProperty> Map<TProperty>(Expression<Func<TType, TProperty>> expression) { var result = new PropertyMapResult<TType, TProperty>(this, expression); propertyMappers.Add(result); return result; }

PropertyMapResult är sedan en klass med massor med reflection magi etc för att läsa / skriva från / till properties på objektinstanser

edit: Insåg att det kanske var lite taskigt att helt exkludera kod från PropertyMapper
Den gör i princip

public PropertyMapResult(MapResult<TType> parent, Expression<Func<TType, TProperty>> expression) { this.parent = parent; var member = expression.Body as MemberExpression; propertyInfo = member.Member as PropertyInfo; propertyType = GetPropertyType(); }

För att hämta ut typen kan det behövas lite extra logik jag gör såhär för att även stödja nullables (Kan finnas fler edgecases)

private Type GetPropertyType() { var type = typeof (TProperty); if (type.IsGenericType && type.GetGenericTypeDefinition().IsAssignableFrom(typeof (Nullable<>))) { return type.GetGenericArguments()[0]; } return type; }

Visa signatur
Permalänk
Medlem

Vill du spara ner ett objekt på disk och sedan läsa in det?

private void Write() { Company c = new Company(); c.CompanyID = 25; c.CompanyName = "Company25"; Stream s = File.Open("Companies/25.bin", FileMode.Create); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(s, c); s.Close(); } private void Read() { Stream s = File.Open("Companies/25.bin", FileMode.Open); BinaryFormatter formatter = new BinaryFormatter(); Company c = formatter.Deserialize(s) as Company; s.Close(); MessageBox.Show(c.CompanyID + " // " + c.CompanyName); } [Serializable()] class Company { public int CompanyID { get; set; } public string CompanyName { get; set; } }

Permalänk
Avstängd
Skrivet av hultron:

Vill du spara ner ett objekt på disk och sedan läsa in det?

En varning, binärfiler kan vara extremt svåra att migrera

Visa signatur
Permalänk
Medlem
Skrivet av CyberVillain:

En varning, binärfiler kan vara extremt svåra att migrera

Går alltid att använda XmlSerializer om man oroar sig.

private void Write() { Company c = new Company(); c.CompanyID = 25; c.CompanyName = "Company25"; Stream s = File.Open("Companies/25.xml", FileMode.Create); XmlSerializer x = new XmlSerializer(typeof(Company)); x.Serialize(s, c); s.Close(); } private void Read() { Stream s = File.Open("Companies/25.xml", FileMode.Open); XmlSerializer x = new XmlSerializer(typeof(Company)); Company c = x.Deserialize(s) as Company; s.Close(); MessageBox.Show(c.CompanyID + " // " + c.CompanyName); } [Serializable()] class Company { public int CompanyID { get; set; } public string CompanyName { get; set; } }

Permalänk
Skrivet av hultron:

Går alltid att använda XmlSerializer om man oroar sig.

Denna lösning är bra om man inte har några speciella krav annat än att spara undan data i en fil för senare läsning. Tumme upp.

Permalänk
Avstängd

Jag antog att det var ett custom format från trejdepart, där av mitt svar om flatfils mapping. Om det är xml och du har en xsd finns det ju såklart andra verktyg. Eller om det är internt i ditt system XmlSerializer eller WCF's DataContractSerializer

edti: De kräver dock attribut och jag hatar attrobit, tex newtonsofts JSON.NET så slipper du det

Visa signatur
Permalänk
Skrivet av CyberVillain:

Jag antog att det var ett custom format från trejdepart, där av mitt svar om flatfils mapping. Om det är xml och du har en xsd finns det ju såklart andra verktyg. Eller om det är internt i ditt system XmlSerializer eller WCF's DataContractSerializer

edti: De kräver dock attribut och jag hatar attrobit, tex newtonsofts JSON.NET så slipper du det

Json är ett trevligt format det med, föredrar det för kommunikation mellan olika system, t.ex. när man pratar med ett Web API, däremot är XML fortfarande en fullgod standard för att spara systemägd information där en databas inte behövs eller inte kan användas.

Permalänk
Avstängd

Jag gillar också JSON så länge det backas upp av någon form av typsäkerthet via delat DTO namespace
Tex använder jag det för typade Query / commands mellan JS klient och .NEt backend.

http://andersmalmgren.com/2014/02/05/typed-javascript-contrac...

Visa signatur