Tag Archives: Snippet

RESX Dummy Dateien generieren

Wird die Lokalisierung bzw. Internationalisierung einer Applikation mit Hilfe von resx Dateien gemacht, kann es nützlich sein, sich von einer bestehenden resx Datei eine neue resx Datei zu erstellen, welche die Grundlage für die Unterstützung einer neuen Sprache darstellt.

Zu Testzwecken wird dann jeder Eintrag in der neuen resx Datei mit zwei Zeichen ISO Code der neuen Sprache prefixt.
So kann rasch getestet werden ob die Lokalisierung funktioniert.

PowerShell eignet sich wunderbar zur erstellen eines solchen Scripts.

$neutralResxFileName = "MyResxFilenNameWithoutExtension";
$lang = "en"

$text = Get-Content $neutralResxFileName + ".resx"
foreach($val in $text.root.data)
{
	$str = ($val.value + " " + $lang)
	$val.value = $str
}

$text.Save(".\" + $neutralResxFileName + "." + $lang + ".resx")

Plug-In auf Close Message eines Incidents – wo ist die Incident Id?

Wird ein Plug-In auf die “Close” Message eines Incidents registriert, wird das Plug-In gefeuert, sobald der Incident geschlossen wird. Die “PrimaryEntityId” des “IPluginExecutionContext” ist jedoch leer (Guid.Empty). Wie erhalte ich die Id des Incidents? Die Id des Incidents, welches die “Close” Message ausgelöst hat erhält man wie folgt:

var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
var incidentResolutionEntity = (Entity)context.InputParameters["IncidentResolution"];
Guid incidentId = ((EntityReference)incidentResolutionEntity.Attributes["incidentid"]).Id;

OrganizationServiceProxy mit lokalem User

Wie kann ich auf eine Organization bzw. einen Organization Service zugreifen und dabei die Credentials des aktuellen Benutzers verwenden?

var credentials = new ClientCredentials();
credentials.Windows.ClientCredential =
  CredentialCache.DefaultNetworkCredentials;
IOrganizationService organizationService = 
  new OrganizationServiceProxy(new Uri(url), null, credentials, null);

Get Types by Interface

Die Anforderung ist relativ einfach und kommt immer wieder. Alle Types welche ein bestimmtes Interface implementieren sollen zurückgegeben werden.

var interfaceType = typeof(IMyInterface);
var types = AppDomain.CurrentDomain.GetAssemblies()
    .SelectMany(t => t.GetTypes())
    .Where(t => interfaceType.IsAssignableFrom(t) && !t.IsInterface && !t.IsAbstract);

Das Snippet liefert dabei nur Types zurück die selbst kein Interface sind und Instanziert werden können (nicht abstrakt).

Code Snipped “Commandline Option Chooser”

Als Interface dient eine Console. Der Benutzer soll eine Auswahl treffen. Alles fängt an mit einem If, irgendeinmal wird ein Switch daraus und schlussendlich möchte man dann doch etwas generisches. Bereits unzählige Male habe ich genau für dieses Problem Code geschrieben. Meistens war die Consolen App nur eine kleine Spielerei. Das nächste Mal, am selben Punkt, war der Code nicht mehr auffindbar. Grund genug um hier ein kleines Snippet zu posten.

public class Chooser
{
    private const int Offset = 1;

    private readonly string question;
    private readonly IList<string> options;

    public Chooser(string question, IEnumerable<string> options)
    {
        this.question = question;
        this.options = options.ToList();
    }

    public string AskUser()
    {
        while (true)
        {
            Console.WriteLine(question);
            Console.WriteLine();

            PrintOptionsList();

            string answerText = Console.ReadLine();
            int answerNumber;
            if (int.TryParse(answerText, out answerNumber) && answerNumber - Offset < options.Count && answerNumber - Offset >= 0)
            {
                Console.Clear();
                return options[answerNumber - Offset];
            }

            Console.Clear();
        }
    }

    private void PrintOptionsList()
    {
        for (int i = 0; i < options.Count; i++)
        {
            var option = options[i];
            Console.WriteLine("{0}. {1}", i + Offset, option);
        }
    }

Und hier noch die Enhanced Version:

public class Chooser<TAnswer>
{
    private const int Offset = 1;

    private readonly string question;
    private readonly IEnumerable<KeyValuePair<string, TAnswer>> options;

    public Chooser(string question, IEnumerable<KeyValuePair<string, TAnswer>> options)
    {
        this.question = question;
        this.options = options;
    }

    public TAnswer AskUserAcceptSingleAnswer()
    {
        return AskUser("").Single();
    }

    public IEnumerable<TAnswer> AskUserAcceptMultipleAnswers()
    {
        return AskUser(",");
    }

    public IEnumerable<TAnswer> AskUserAcceptMultipleAnswers(string separator)
    {
        return AskUser(separator);
    }

    private IEnumerable<TAnswer> AskUser(string separator)
    {
        while (true)
        {
            Console.WriteLine(question);
            Console.WriteLine();

            PrintOptionsList();

            string answerText = Console.ReadLine();
            foreach (var splittedAnswerText in answerText.Split(new[] { separator }, StringSplitOptions.RemoveEmptyEntries))
            {
                int answerNumber;
                if (int.TryParse(splittedAnswerText, out answerNumber) &amp;&amp; answerNumber - Offset < options.Count() &amp;&amp; answerNumber - Offset >= 0)
                {
                    Console.Clear();
                    yield return options.ElementAt(answerNumber - Offset).Value;
                }

                Console.Clear();
            }
        }
    }

    private void PrintOptionsList()
    {
        for (int i = 0; i < options.Count(); i++)
        {
            var option = options.ElementAt(i).Key;
            Console.WriteLine("{0}. {1}", i + Offset, option);
        }
    }
}