Как ввести/генерировать код инфраструктуры в методы, украшенные Атрибутом?

ОТЛИЧНЫЙ ключевое слово, которое Вы ищете.

В MSSQL, копируя уникальные строки от таблицы до другого может быть сделан как это:

SELECT DISTINCT column_name
INTO newTable
FROM srcTable

Эти column_name столбец, от которого Вы ищете уникальные значения.

Протестированный и работы.

10
задан Yannick Motton 12 December 2011 в 15:43
поделиться

4 ответа

6
ответ дан 4 December 2019 в 01:02
поделиться

Я использовал следующую функцию Memoize в своем проекте:

public class Foo
{
    public int Fibonacci(int n)
    {
        return n > 1 ? Fibonacci(n - 1) + Fibonacci(n - 2) : n;
    }
}

class Program
{
    public static Func<Т, TResult> Memoize<Т, TResult>(Func<Т, TResult> f) where Т : IEquatable<Т>
    {
        Dictionary<Т, TResult> map = new Dictionary<Т, TResult>();
        return a =>
        {
            TResult local;
            if (!TryGetValue<Т, TResult>(map, a, out local))
            {
                local = f(a);
                map.Add(a, local);
            }
            return local;
        };
    }

    private static bool TryGetValue<Т, TResult>(Dictionary<Т, TResult> map, Т key, out TResult value) where Т : IEquatable<Т>
    {
        EqualityComparer<Т> comparer = EqualityComparer<Т>.Default;
        foreach (KeyValuePair<Т, TResult> pair in map)
        {
            if (comparer.Equals(pair.Key, key))
            {
                value = pair.Value;
                return true;
            }
        }
        value = default(TResult);
        return false;
    }


    static void Main(string[] args)
    {
        var foo = new Foo();
        // Transform the original function and render it with memory
        var memoizedFibonacci = Memoize<int, int>(foo.Fibonacci);

        // memoizedFibonacci is a transformation of the original function that can be used from now on:
        // Note that only the first call will hit the original function
        Console.WriteLine(memoizedFibonacci(3));
        Console.WriteLine(memoizedFibonacci(3));
        Console.WriteLine(memoizedFibonacci(3));
        Console.WriteLine(memoizedFibonacci(3));
    }
}

В моем проекте мне нужны были только функции с одним аргументом, реализующие IEquatable <Т> но это можно обобщить и дальше. Еще одно важное замечание: этот код не является потокобезопасным. Если вам нужна потокобезопасность, вам необходимо синхронизировать доступ для чтения / записи к хэш-таблице внутренней карты.

3
ответ дан 4 December 2019 в 01:02
поделиться

Чтобы конкретно ответить на ваши вопросы:

  1. Это, вероятно, было бы слишком сложно сделать так, как вы описываете, как вам понадобится полноценная грамматика C # парсер. Что может быть более жизнеспособным альтернатива - написание управляемого приложения который может загрузить скомпилированный тип сборки и извлечения информация с использованием Reflection. Эта будет включать получение всех типов объекты в данной сборке, ищущие для методов по типам, получение настраиваемый атрибут, а затем выдача кода мемоизации (это часть может быть немного сложной).
  2. Если вы пойдете по маршруту, который я упомянул в № 1, вы могли бы просто добавьте этап после сборки для запуска вашего инструмента. Visual Studio (который использует MSBuild внизу) делает это относительно легко.
1
ответ дан 4 December 2019 в 01:02
поделиться

Если вы напишете плагин для PostSharp вместо использования его библиотеки LAOS, вы не получите снижения производительности.

1
ответ дан 4 December 2019 в 01:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: