Лучший способ сохранить перечислимые значения в базе данных - Строка или Интервал

Чтобы вызвать конструктор, Activator.CreateInstance сделает свое дело. Он имеет множество перегрузок, чтобы сделать вашу жизнь проще.

Если ваш конструктор без параметров :

object instance = Activator.CreateInstance(type)

Если вам нужно параметров :

object instance =  Activator.CreateInstance(type, param1, param2)

Для вызова метода, Если у вас есть объект Type , вы можете вызвать GetMethod , чтобы получить метод , а затем Invoke (с или без параметры), чтобы вызвать его. Если вам это нужно, Invoke также выдаст вам возвращаемое значение функции, которую вы вызываете (или NULL, если это метод void),

Для более подробного примера (вставьте в консольное приложение и перейдите ):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;

namespace Test
{
    public static class Invoker
    {
        public static object CreateAndInvoke(string typeName, object[] constructorArgs, string methodName, object[] methodArgs)
        {
            Type type = Type.GetType(typeName);
            object instance = Activator.CreateInstance(type, constructorArgs);

            MethodInfo method = type.GetMethod(methodName);
            return method.Invoke(instance, methodArgs);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // Default constructor, void method
            Invoker.CreateAndInvoke("Test.Tester", null, "TestMethod", null);

            // Constructor that takes a parameter
            Invoker.CreateAndInvoke("Test.Tester", new[] { "constructorParam" }, "TestMethodUsingValueFromConstructorAndArgs", new object[] { "moo", false });

            // Constructor that takes a parameter, invokes a method with a return value
            string result = (string)Invoker.CreateAndInvoke("Test.Tester", new object[] { "constructorValue" }, "GetContstructorValue", null);
            Console.WriteLine("Expect [constructorValue], got:" + result);

            Console.ReadKey(true);
        }
    }

    public class Tester
    {
        public string _testField;

        public Tester()
        {
        }

        public Tester(string arg)
        {
            _testField = arg;
        }

        public void TestMethod()
        {
            Console.WriteLine("Called TestMethod");
        }

        public void TestMethodWithArg(string arg)
        {
            Console.WriteLine("Called TestMethodWithArg: " + arg);
        }

        public void TestMethodUsingValueFromConstructorAndArgs(string arg, bool arg2)
        {
            Console.WriteLine("Called TestMethodUsingValueFromConstructorAndArg " + arg + " " + arg2 + " " + _testField);
        }

        public string GetContstructorValue()
        {
            return _testField;
        }
    }
}

19
задан iniki 23 October 2009 в 09:25
поделиться

2 ответа

Оба имеют преимущества. Если вы сохраняете их по их целочисленному значению, вы должны быть осторожны, редактируя перечисление позже в своем проекте. Если каким-то образом целочисленные значения для элементов перечисления будут переопределены, все ваши данные будут повреждены. Но это будет самый быстрый / наименьший тип данных для использования.

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

В конце концов, я думаю, нет окончательного победителя.

Редактировать

Использование целочисленного значения может быть лучшим способом. Вы можете преодолеть проблему «переопределенного значения» для элементов перечисления, установив значение для каждого элемента самостоятельно.

16
ответ дан 30 November 2019 в 03:38
поделиться

Реализация проста в обоих случаях, и разница в производительности должна быть незначительной.

Поэтому используйте значение: Строки более значимы, чем числа , поэтому используйте String.

20
ответ дан 30 November 2019 в 03:38
поделиться
Другие вопросы по тегам:

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