Mit ‘C#’ getaggte Artikel

Fauler Dictionaries füllen

Mittwoch, 07. April 2010

Etwas aufwändig:

var result = new Dictionary<string, string>();
result["username"] = username;
result["mail"] = email;
return result;

Besser ist:

return new Dictionary<string, string>()
    .With("username", username)
    .With("mail", email);

Mit dieser Extension-Methode:

public static Dictionary<T, W> With<T, W>(this Dictionary<T, W> dict, T key, W value)
{
    dict[key] = value;
    return dict;
}

Klassenbrowser als Kommandozeilenapplikation

Sonntag, 08. November 2009

Um mir einen Überblick über die Namespaces, Klassen und Typen des FBK zu verschaffen, habe ich mir ein kleines Hilfsprogramm geschrieben. Dieses inspiziert eine Assembly und gibt das Ergebnis in verschiedenen Formaten aus:

  • Als pure Textdatei
  • Als Xml-Datei mit dem Schema: (assembly->class->(field|method|property)->Parameter)
  • Als baumartige Xml-Datei, bei der jeder Namensraum einen eigenen Xml-Knoten darstellt und die Klassen darunter angezeigt werden.

Das Programm ist unter http://www.depon.net/downloads/classbrowser.zip herunterladbar und über Kommandozeile aufzurufen:

ClassBrowser.exe Input.dll
    [-exportformat=xml|csv|xmlclasstree]
    [-compilergenerated=yes|no]
    [-onlyclasses=yes|no]
Input.dll
    Der erste Parameter wird immer als einzulesende Assembly gewertet.

-exportformat=xml|csv
    Optionaler Parameter, der festlegt in welchem Format die Ausgabe
    des Programmes auf Standard-Out durchgeführt werden soll.
    Wird kein Format angegeben, so erfolgt die Ausgabe im Xml-Format.

-compilergenerated=yes|no
    Optionaler Parameter, der festlegt, ob Compilergenerierte Klassen
    und Methoden mit dem CompilerGeneratedAttribute ebenfalls angezeigt
    werden sollen.
-onlyclasses=yes|no
    Optionaler Parameter, der festlegt, ob nur Klassen angezeigt werden
    sollen.

Ein kleiner Screenshot der mit ‘xmlclasstree’ erzeugten Xml-Datei.

image

SQLite und C#

Montag, 19. Oktober 2009

Gerade gefunden, werde ich mir nachher mal antun:

http://sqlite.phxsoftware.com/

Supported Platforms

Debugger anfordern

Samstag, 26. September 2009

Hin und wieder gibt es den Bedarf den Ablauf eines Programmes zu stoppen und in den Debugger zu springen. Visual Studio bietet hier die komfortable Möglichkeit der Haltepunkte (neudeutsch Breakpoints). Leider gibt es öfter Situationen, an denen ein einfacher Breakpoint nicht ausreicht. Dies ist insbesondere der Fall wenn die jeweilige Zeile 100fach ausgeführt wird, aber man nur bei einer bestimmten Nebenbedingung den Debugger auslösen möchte.

System.Diagnostics.Debugger.Break()

Diese Funktionalität nutze ich beim FBK. Wenn ich die Ausführung einer bestimmten Rolle testen möchte, trage ich in der Xml-Konfigurationsdatei das Attribut ‘debug’ ein.

        <role type="mutateresources" id="BeerMutating" debug="True">
          <input>
            <resource type="Hop" amount="8" />
            <resource type="Brewer" amount="8" />
          </input>
          <output>
            <resource type="Beer" amount="8" />
          </output>
          <outputresearcheffects>
            <researcheffect research="Brewery">
              <multiplicator type="exponential"
                             factor="1"
                             base="1.1"
                             exponentoffset="0"
                             offset="0" />
            </researcheffect>
          </outputresearcheffects>
        </role>

Wird diese Rolle nun ausgeführt, so hält Visual Studio die Ausführung an und ermöglicht ein einfaches Debuggen.

/// <summary>
/// Executes the role
/// </summary>
/// <param name="worldState">Current worldstate</param>
public void Execute(IWorldState worldState)
{
    if (this.Role.IsDebug)
    {
        Debugger.Break();
    }

    this.Role.ExecuteRole(this.RoleStatus, worldState);
}

Nettes Feature…

Manchmal darf es eben LINQ sein

Samstag, 22. August 2009

/// <summary>
/// Gets the dashboarditems of the player
/// </summary>
/// <param name="amount">Number of items to be returned</param>
/// <returns>Enumeration of Dashboarditems</returns>
public IEnumerable<DashboardItem> GetDashboardItems(int amount)
{
    var messageSystem = this.LogicSession.GetLogicHandler<IMessageSystemLogic>();
    var playerActionLogic = this.LogicSession.GetLogicHandler<IPlayerActionLogic>();
    var languageHandler = this.LogicSession.GetLogicHandler<ILanguageHandler>();

    return from y in
               ((from x in messageSystem.GetMessages(this.playerLogic.PlayerId)
                 orderby x.Created
                 select x).Take(amount))
           let z = playerActionLogic.GetPlayer(y.SenderId)
           let playername = z == null ?
                    languageHandler["/web/messagespage/system"] :
                    z.GetData().Playername
           select new DashboardItem(
               playername,
               y.Subject +
                (!string.IsNullOrEmpty (y.Content) ?  " – " + y.Content : string.Empty),
               DashboardItem.DefaultType.Message,
               DateTime.Now);
}

Hin und wieder muss man einfach mal unkonventionell programmieren. Nicht das schönste Query, aber es funktioniert.