Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как создать переменную из названия типа. 
V
    Опции темы
IEZ
Дата 17.10.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 10.2.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 3



Приветствую Всех.
У меня есть для строковых переменных:

Код

/// Значение
string data = "25.55";
/// Тип переменной
string typedata = "decimal";



typedata может принимать различные значения, к примеру

Код

typedata = "string";
typedata = "decimal"
typedata = "double";
typedata = "uint64";
typedata = "int64";



Вопрос:
Возможно ли на основе typedata создать динамически переменную соответствующего типа для последующей
проверки data на соответствие типу (на подобии Decimal.Parse(data)).
Спасибо.


--------------------
"Нужно делать так, как нужно, а как не нужно, делать не нужно" (с) Винни-Пух.
PM MAIL WWW ICQ   Вверх
tol05
Дата 17.10.2007, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



try
{
   object  obj = Activator.CreateInstance (Type.GetType(typedata));
}
catch(Exception ex)
{
...
}
список исключений - смотри по методам Activator.CreateInstance() и Type.GetType()

Потом с помощью obj.GetType() узнаешь реальный тип переменной


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
1stain
Дата 17.10.2007, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 4
Всего: 40



Код

            List<String> typeNames = new List<string>(new String[] { "kjh", "int32", "decimal", "single" });
            Object []parameter = new object[]{"123", "abc", "34.576"};
            System.Globalization.NumberFormatInfo numberFormat = System.Globalization.CultureInfo.InvariantCulture.NumberFormat;
            foreach (String typeName in typeNames)
            {
                try
                {
                    Type t = Type.GetType(String.Format("System.{0}", typeName), true, true);
                    System.Reflection.MethodInfo parseMethod = t.GetMethod("Parse", new Type[] { typeof(String), typeof(IFormatProvider) });
                    foreach (object o in parameter)
                    {
                        try
                        {
                            parseMethod.Invoke(null, new object[] { o, numberFormat });
                            Console.WriteLine(String.Format("{0} is {1}", o, t.Name));
                        }
                        catch (System.Reflection.TargetInvocationException e)
                        {
                            if ( e.InnerException.GetType() != typeof( System.FormatException ) )
                               throw;
                            Console.WriteLine(String.Format("{0} NOT is {1}", o, t.Name));
                        }
                    }
                }
                catch (TypeLoadException)
                {
                    Console.WriteLine( String.Format("System.{0} is not valid type name", typeName));
                    continue;
                }
            }
            
        }



--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
IEZ
Дата 17.10.2007, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 10.2.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 3



1stain, Спасибо.


--------------------
"Нужно делать так, как нужно, а как не нужно, делать не нужно" (с) Винни-Пух.
PM MAIL WWW ICQ   Вверх
1stain
Дата 18.10.2007, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 4
Всего: 40



только что поставил VS2008 - под впечатлением от увиденного, решился добавить к выше написанному коду код на C# 3.0
Смысл кода - расширяем класс System.String  дженерик методом для проверки строки на валидность типу
Код

namespace MyExtensions
{
    public static class MyExtensions
    {
        public static Boolean CheckValidity<T>(this String stringValue)
        {
            return stringValue.CheckValidity<T>(false);
        }

        ///<exception cref="System.NotSupportedException">Throw when throwIfCantParse set true and validated type don't contain Parse method</exception>
        public static Boolean CheckValidity<T>(this String stringValue, Boolean throwIfCantParse)
        {
            System.Reflection.MethodInfo parseMethod;
            parseMethod = (typeof(T)).GetMethod("Parse", new Type[] { typeof(String) });
            if (parseMethod == null)
                if (throwIfCantParse)
                    throw new NotSupportedException(String.Format("Type {0} not supported parsing from String", (typeof(T)).Name));
                else
                    return false;
            try
            {
                parseMethod.Invoke(null, new object[] { stringValue });
                return true;
            }
            catch (System.Reflection.TargetInvocationException e)
            {
                if (e.InnerException.GetType() != typeof(System.FormatException))
                    throw;
                return false;
            }
        }
    }
}


Код

using MyExtensions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("127.0.0.1".CheckValidity<System.Net.IPAddress>().ToString()); // true
            Console.WriteLine( "123".CheckValidity<Int32>().ToString()); // true

            Console.WriteLine("12.3".CheckValidity<Int32>().ToString()); // false
            Console.WriteLine("123".CheckValidity<System.Drawing.Point>(false).ToString()); //false
            Console.WriteLine("123".CheckValidity<System.Drawing.Point>(true).ToString()); // System.NotSupportedException
        }
    }
}


Это сообщение отредактировал(а) 1stain - 18.10.2007, 19:20


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
IEZ
Дата 18.10.2007, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 10.2.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 3



Цитата(1stain @  18.10.2007,  16:38 Найти цитируемый пост)
только что поставил VS2008

Релиз?
Гле взял?


--------------------
"Нужно делать так, как нужно, а как не нужно, делать не нужно" (с) Винни-Пух.
PM MAIL WWW ICQ   Вверх
1stain
Дата 18.10.2007, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 4
Всего: 40



Цитата(IEZ @  18.10.2007,  20:56 Найти цитируемый пост)
Релиз?Гле взял?

Билл Гейц на ДР подарил  smile 
бета2 ессно


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
CityAC
Дата 30.10.2007, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 3.11.2006
Где: Украина Горловка

Репутация: нет
Всего: 1



В продолжение темы. 
А если нужно создать контролл на основе названия класса
Например
Код

string className = "System.Windows.Forms.ComboBox"
Type tp2 = Type.GetType(className); // возвращает null  НЕ МОГУ ПОНЯТЬ ПОЧЕМУ?


Как с помощью className создать ComboBox?

Это сообщение отредактировал(а) CityAC - 30.10.2007, 23:23
--------------------
Вижу цель, не вижу припятствий.  
PM MAIL ICQ   Вверх
arial
Дата 31.10.2007, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 772
Регистрация: 11.3.2003
Где: Архангельская обл .

Репутация: нет
Всего: 7



Код
Activator.CreateInstance(Type);



--------------------
Есть люди, в которых живет Бог. Есть люди, в которых живет дьявол. А есть люди, в которых живут только глисты. (Ф. Раневская)
PM ICQ   Вверх
CityAC
Дата 31.10.2007, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 3.11.2006
Где: Украина Горловка

Репутация: нет
Всего: 1



Цитата(arial @  31.10.2007,  08:28 Найти цитируемый пост)
код C#1:Activator.CreateInstance(Type);

Ну и где я возьму Type. Мне Type нужно получить из строки с названием типа а 
Код

Type tp2 = Type.GetType(className); 

 возвращает null  НЕ МОГУ ПОНЯТЬ ПОЧЕМУ?
В таблице хранится информация о контролле, который нужно создать: Тип контролла, его локэйшн и проч.
Так вот я не могу создать тип сз текстовой строки (напр. "System.Windows.Forms.ComboBox").
Еще раз повторюсь 
Код

string typestr = ds2.Rows[0]["Type"].ToString();     //в typestr ложится строка "System.Windows.Forms.ComboBox"
Type tp2 = Type.GetType(className); 

не возвращает тип, а возвращает null
Ну че за фигня.
Наприемер Type.GetType("System.String") возвращает тип нормально, а тип контролла возваращать не хочет



Это сообщение отредактировал(а) CityAC - 31.10.2007, 10:04
--------------------
Вижу цель, не вижу припятствий.  
PM MAIL ICQ   Вверх
CityAC
Дата 31.10.2007, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 3.11.2006
Где: Украина Горловка

Репутация: нет
Всего: 1



Опечатка в последнем куске кода и не редактируется
Верно так
Код

string typestr = ds2.Rows[0]["Type"].ToString();     //в typestr ложится строка "System.Windows.Forms.ComboBox"
Type tp2 = Type.GetType(typestr); 


Это сообщение отредактировал(а) CityAC - 31.10.2007, 10:30
--------------------
Вижу цель, не вижу припятствий.  
PM MAIL ICQ   Вверх
CityAC
Дата 31.10.2007, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 3.11.2006
Где: Украина Горловка

Репутация: нет
Всего: 1



Разобрался, если кому надо вот ссылка http://www.sql.ru/forum/actualthread.aspx?tid=223833
--------------------
Вижу цель, не вижу припятствий.  
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.1451 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.