2016-08-17 4 views
0

У меня есть база данных, которая хранит пользовательские входы в абстрактной строчной форме. Эти пользовательские входы имеют столбец varchar, который описывает его тип (строка, десятичный знак, bool, выпадающий список и т. Д.).динамически возвращать объект на основе строкового описания его типа

Теперь этот get's отправляет на передний конец, чтобы отобразить некоторые элементы ввода в браузере. Это отлично работает!

Однако, поскольку ввод является таким общим, это значение также является varchar. Проблема, с которой я столкнулась, заключается в том, что мне нужно сделать некоторую проверку на значение. (например, в некотором строковом вводе задано значение maxLength или регулярное выражение, десятичное значение может иметь минимальное и максимальное значение).

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

Я хотел бы получить функцию, которая вернет анализируемое значение в правильном типе.

, так что я бы иметь функцию, которая что-то вроде этого:

public {something here} ParseValue(InputObject object, string type) { 
    // parse here based on type 
    // InputObject has a few properties like value, min, max, regex etc 
    // all as a string. 
    // for instance if type is datetime I want to return a new object 
    // which has parsed the value, min and max as datetime. 
    // it should also be possible for the type to be decimal and min, max 
    // and value should be decimal in the outputObject 
} 

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

любая помощь приветствуется!

+3

'{something here}' должен быть просто 'object'. Остальное должно быть простым - просто делайте то, что вы делаете в динамически типизированной среде. – adv12

+0

Существует тип динамического возврата, который можно использовать здесь. – zdimension

+1

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

ответ

0

Что вы можете сделать, это создать interface IValidatable, который определяет способ, например Validate(). Тогда вы можете использовать это как возвращаемый тип. Затем вы просто анализируете свое значение с помощью коммутатора (возможно, делегируете его некоторому методу или классу) для реализации IValidatable. Например.

public interface IValidatable { 
    bool Validate(); 
} 


public class ValidateableInteger : IValidatable { 
    private int _value; 
    public ValidateableInteger(int i) { 
      _value = i;  
    } 

    bool Validate() { 
      //code where you validate your integer. 
    } 
} 

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

Кроме того, вы можете создавать более конкретные интерфейсы, например. числовые типы (например, IValidateableNumeric и ValidateableInt : IValidateableNumeric)

Обратите внимание, что вы в основном печатая ввод здесь, хотя, что kindof странным и ненужным, учитывая тот факт, что вы можете просто работать с типизированными данными, чтобы начать с.

В конце концов, я бы отговорил людей от обходной системы типа таким образом. В этом случае особенно много способов создания элементов формы при использовании типизированных данных (проверка механизма шаблона Razor).

1

Вам было бы лучше, если вы не попытаетесь оценить тип по типу базы данных и вместо этого сохраните «настоящий» тип в отдельном столбце базы данных. За исключением, если вы строите связь между C# -типы и базы данных-типов, потому что вы можете сделать что-то подобное, то:

String val = "123"; 
String type = "System.Int32"; 
Type tempType = Type.GetType(type); 
if (tempType == null) 
    return null; 
dynamic result = Convert.ChangeType(val, tempType); 

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