.NET: Как вы получаете тип нулевого объекта?

Не удается обнаружить только с PHP.

Я бы подумал, что вы не любите Modernizr, это действительно потрясающе.

30
задан nawfal 25 April 2013 в 20:41
поделиться

10 ответов

Так там какой-либо способ получить тип объекта, который устанавливается в NULL? Я думал бы, что должен будет быть способ знать то, что вводит место хранения, без него присваиваемый что-либо.

Не обязательно. Лучшее, которое можно сказать, - то, что это object. null ссылка не указывает ни на какое место хранения, таким образом, нет никаких метаданных, из которых это может сделать то определение.

лучшее, которое Вы могли сделать, изменить его, чтобы быть более универсальным, как в:

public void GetParameterValue<T>(out T destination)
{
    object paramVal = "Blah";
    destination = default(T);
    destination = Convert.ChangeType(paramVal, typeof(T));
}

тип T может быть выведен, таким образом, Вы не должны должны быть давать параметр типа методу явно.

32
ответ дан Marcus Griep 25 April 2013 в 20:41
поделиться
  • 1
    Это работает! Нажмите Dashboard ' Settings' > ' Сохраните As'. хранит новую идентичную панель инструментов под новым именем. – F. Santiago 17 November 2018 в 07:01

Возможно, если Вы не возражаете объявлять свой метод как дженерик. Попробуйте это.

class Program
{
    public static void GetParameterValue<T>(out T destination)
    {
        Console.WriteLine("typeof(T)=" + typeof(T).Name);
        destination = default(T);
    }
    static void Main(string[] args)
    {
        string s;
        GetParameterValue(out s);
        int i;
        GetParameterValue(out i);
    }
}
8
ответ дан Damian Powell 25 April 2013 в 20:41
поделиться
  • 1
    Это хорошо работает для меня. Предшествующая панель инструментов все еще существует, новый сохраняется с новым именем. – jerome 29 January 2019 в 19:46

Тип Вашей целевой переменной всегда System.Object. Вы могли просто возвратиться

Convert.ChangeType(paramVal, System.Object).
2
ответ дан Jason Plank 25 April 2013 в 20:41
поделиться
  • 1
    Извините, оставленный случайное сам там на первом показе. У Вас все еще есть класс FileUtility где-нибудь? – Collin 4 October 2012 в 20:50

В настоящее время у Вас нет способа знать то, что передается в метод. Можно преобразовать его в общий метод. Как это:

public void GetParameterValue<T>(out T destination) { ... }

3
ответ дан Jelon 25 April 2013 в 20:41
поделиться
  • 1
    Привет Collin, спасибо за ответ, я сделал, как Вы предположили, простой файл Python со списком методов и в основном: dir = FileUtility. GetFilePath (путь) я получил ошибку: несвязанный GetFilePath метода () нужно назвать с экземпляром FileUtility как первый аргумент (получил str экземпляр вместо этого), – ilyaw77 4 October 2012 в 20:48

В Вашем примере это был бы пустой указатель типа System.Object.

, Ваш пример даже компилирует? Я добираюсь, "не может преобразовать из, 'строка к' 'возражает'" ошибке.

0
ответ дан Mark Cidade 25 April 2013 в 20:41
поделиться
  • 1
    " они don' t действительно имеют purpose". я думаю, что у них есть цель, в том иногда Вы хотите метод обоим быть наследуемыми (следовательно часть класса) и все же поддерживать статические ссылки. Это и другие примеры использования существуют в Python, как обрисовано в общих чертах приятно в этом ответе: stackoverflow.com/questions/136097/… – ecoe 9 September 2018 в 19:27

Я не думаю, что возможно получить тип, когда значение является пустым. Кроме того, так как Вы звоните в GetParameterValue, лучшее, которое Вы могли сделать (когда значение является пустым) должно получить тип "целевого" параметра, который является "объектом". Вы могли бы рассматривать передачу Типа в качестве параметра к GetParameterValue, где у Вас есть больше информации, такой как:

public void GetParameterValue(Type sourceType, out object destination) { //... }
0
ответ дан Ryan 25 April 2013 в 20:41
поделиться
  • 1
    I' ve, записанные на многих языках для многих, многих годах и сильно, верят в OO как методология для сложных систем. Много раз я хочу совместно использовать некоторый тип константы, например. Я понимаю " Pythonic way" и все, но where' s строка между " Pythonic" и " хорошее OO design" в системе иначе-OO? – Will 7 July 2013 в 23:10

@Rally25s:

string val;
GetParameterValue("parameterName", out val);

Это неясно из Вашего сообщения (в ответах), что проблема, с которой был. Если объявлено как:

void GetParameterValue<T>(string parameterName, out T val)  { }

, Чем вызов, поскольку Вы записали его выше, будет работать (Вы не должны определять тип). Я - предположение, которое не работало на Вас, потому что Вы не можете использовать свойство в качестве параметр. Путь вокруг этого состоит в том, чтобы использовать оба метода:

T GetParameterValue<T>(string parameterName, T ununsed)  { }

Это назвали бы как это:

MyObj.SomeProp = GetParameterValue("parameterName", MyObj.SomeProp);

, который является скорее kludgey, но не худшая представленная методика.

<час>

А различный метод, который я использовал в C++, но еще не попробовал в C#, должен иметь GetParameterValue () некоторый объект Вас собственный дизайн, и затем реализовать много неявных операторов броска для него.

class ParameterHelper
{
   private object value;
   public ParameterHelper(object value)   { this.value = value;  }

   public static implicit operator int(ParameterHelper v)
     { return (int) v.value; }

}
ParameterHelper GetParameterValue( string parameterName);

MyObj.SomeProp = GetParameterValue("parameterName");
1
ответ дан James Curran 25 April 2013 в 20:41
поделиться
  • 1
    Точка, Вы shouldn' t имеют класс FileUtility. Так же, как Вы могли бы записать бесплатные функции в C++, необходимо сделать то же здесь. Имена модуля (которые отображаются на файлы) должны также быть всем нижним регистром. – Collin 4 October 2012 в 21:01

Если нет никакого экземпляра, нет никакого типа экземпляра.

лучшее, которое можно сделать, использовать тип ссылки, что означает, есть ли у Вас ссылка на объект (как в методе в вопросе), ссылочный тип является объектом.

<час>

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

0
ответ дан Amy B 25 April 2013 в 20:41
поделиться
  • 1
    Почему это не " хорошее OO design"? если Вы добавляете константы, они находятся в пространстве имен модуля. В C++ Вы поместили бы константы в пространство имен, таким образом, то же применяется здесь. В Python модуль является пространством имен. Помещение переменных на верхнем уровне модуля не помещает их в глобальное пространство имен. – Vagrant 1 September 2014 в 17:21

На теоретическом уровне пустой указатель не является действительно тем же как пустым указателем в C, который должен сказать, что это содержит адрес памяти и вот именно? Раз так тогда это подобно случаю деления на нуль в Математике, где результат не определен.

можно было сделать следующее для этой строки:

string val = GetParameterValue<string>("parameterName");

Просто удаляют ту первую строку и теперь нет повторения:

var val = GetParameterValue<string>("parameterName");

Не обязательно, что Вы ищете, хотя существует вопрос того, как каждый интерпретирует пустой указатель?

0
ответ дан JB King 25 April 2013 в 20:41
поделиться
  • 1
    в переадресации связывания MVC имеет 0-5, новая версия 5, и бритва имеет новую версию 3 1-3 – Dylan Corriveau 13 November 2013 в 21:26
//**The working answer**

//**based on your discussion eheheheheeh**

public void s<T>(out T varName)
{
    if (typeof (T) == typeof(HtmlTable)) 
    { 
         //////////       
    }

}

protected void Page_Load(object sender, EventArgs e) 
{
    HtmlTable obj=null ;
    s(out obj);       
}
0
ответ дан 27 November 2019 в 22:20
поделиться
Другие вопросы по тегам:

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