C # Создать класс путем объединения строк - PullRequest
0 голосов
/ 23 сентября 2019
public class Customer
{
    public int ProductId { get; set;},
    public string ProductName { get; set;},
    public string ProductDescription { get; set;},
    public float SalesAmount { get; set;}
}

public class Tracker<T>
{
    [Required, ValidateObject]
    public T Body { get; set; }
    public Date date { get; set; }
    public string GUID{ get; set; }
}

Есть ли способ создать класс, автоматически по точкам или объединенной строке, который будет автоматически компилироваться в Visual Studio

public class CustomerTracker : Tracker<Customer>
{
}

Так что вместо создания сотен классов, как указано выше, я могувозьмите любой класс, и он автоматически сгенерирует этот класс.Разве какая-либо функция библиотеки C # позволяет это делать?

, поэтому Customer.Tracker = public class CustomerTracker : Tracker<Customer>
Customer.ListTracker = public class CustomerTracker : Tracker<IEnumerable<Customer>>

или Food.Tracker = public class FoodTracker : Tracker<Food>

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

Похоже, вам нужно много классов ответов без реализации, чтобы сделать ваш публичный API красивым.Т.е. вместо возврата BaseResponse<SomeClass> вы хотите вернуть SomeClassResponse : BaseResponse<SomeClass>.Если это так, я бы рекомендовал использовать T4 шаблоны .Используя T4, вы можете написать логику шаблона следующим образом:

  1. получить все классы из YourApp.Domain пространства имен
  2. для каждого класса домена генерировать классы ответов, такие как public sealed SomeClassresponse : BaseResponse<SomeClass> {}
  3. просто используйте эти классы в своем коде, потому что они известны во время компиляции.

Вам не нужно генерировать классы во время выполнения, потому что вы уже знаете все классы, которые нужно сгенерировать.Также в любом случае генерация во время выполнения будет медленнее генерации T4.

0 голосов
/ 23 сентября 2019

Если вы хотите динамически создавать код и динамически компилировать, вы можете сделать это, как в моей математической программе, динамически добавлять некоторые функции без необходимости перекомпилировать проект.

У меня есть текстовый файл с телом программы:

using System;

// file curve.txt
namespace UserFunction
{                
    public class BinaryFunction
    {
        public static double MyFunction(double x, double param)
        {
            return param == 0 ?  MyFunction0(x, 0.3) : MyFunction1(x);
        }

        private static double MyFunction0(double x, double param)
        {
            return (1 - param) * x + param * (Math.Pow(x, 3));
        }
        private static double MyFunction1(double x)
        {
            return x * 2;
        }
    }
};

И в проекте C # я динамически компилирую программу и создаю dll.После того, как я могу вызвать метод из созданной DLL.

            // in project C#
    private Func<double, double, double> betterFunction;

    private MethodInfo CreateAndCompileFunction(string filename)
    {
        FileInfo fi = new FileInfo(@".\folder\CurveAssembly.dll");
        CSharpCodeProvider provider = new CSharpCodeProvider();
        CompilerParameters compilerparams = new CompilerParameters();
        compilerparams.OutputAssembly = @".\folder\CurveAssembly.dll";
        CompilerResults results = provider.CompileAssemblyFromFile(compilerparams, filename);

        if (results.Errors.Count > 0)
        {
            // Display compilation errors.
            Console.WriteLine("Errors building {0} into {1}",
                fi.FullName, results.PathToAssembly);
            foreach (CompilerError ce in results.Errors)
            {
                Console.WriteLine("  {0}", ce.ToString());
            }
        }
        else
        {
            // Display a successful compilation message.
            Console.WriteLine("Source {0} built into {1} successfully.",
                fi.FullName, results.PathToAssembly);
        }

        Type binaryFunction = results.CompiledAssembly.GetType("UserFunction.BinaryFunction");
        return binaryFunction.GetMethod("MyFunction");
    }
    public void compileFunction(string curvename)
    {
        MethodInfo function = CreateAndCompileFunction(@".\folder\curve.txt");
        betterFunction = (Func<double, double, double>)Delegate.CreateDelegate(typeof(Func<double, double, double>), function);
    }


    //calling the method inside the dll (betterfunction)
    public double MyFunction(double x, double param)
    {
        return betterFunction(x, param);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...