Создать объект из общего класса, используя класс Имя C # [дубликат]

Чтобы определить, почему код PHP не работает в коде JavaScript , нам нужно понять, что такое клиентский и серверный язык и как они работают.

Серверные языки (PHP и т. д.) : они извлекают записи из баз данных, поддерживают состояние через HTTP-соединение без состояния и выполняют много вещи, требующие безопасности. Они находятся на сервере, эти программы никогда не имеют своего исходного кода для пользователя

Image from wikipedia_http://en.wikipedia.org/wiki/File:Scheme_dynamic_page_en.svg [/g16] image attr

Хотя с другой стороны Клиентский язык на стороне клиента (например, JavaScript) находится в браузере и запускается в браузере, Сценарии на стороне клиента обычно относятся к классу компьютерных программ в Интернете, которые выполняются на стороне клиента, в веб-браузере пользователя, а не на стороне сервера .

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

Итак, когда вы делаете запрос HTTP на сервере, чем сервер, сначала внимательно читает файл PHP, чтобы узнать, есть ли какие-либо задачи, которые необходимо выполнить, и отправлять ответ на клиентскую сторону и снова, как @deceze сказал * Как только PHP закончил вывод ответа, сценарий заканчивается, и на сервере ничего не произойдет, пока не появится новый запрос HTTP . *

Graphical representation [/g17]

Источник изображения

Итак, что мне делать, если мне нужно вызвать PHP? Это зависит от того, как вам это нужно: либо перезагружая страницу, либо используя вызов AJAX.

  1. Вы можете выполнить перезагрузку страницы и отправить запрос HTTP
  2. вы можете сделать вызов AJAX с помощью JavaScript, и это не требует перезагрузки страницы

Хорошо Чтение:

  1. Википедия:
  2. Википедия: скрипты на стороне клиента
  3. Мадара Учиха: разница между клиентской стороной и программированием на стороне сервера

151
задан Robert C. Barth 5 November 2008 в 19:19
поделиться

4 ответа

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

using System;
using System.Reflection;

public class Generic<T>
{
    public Generic()
    {
        Console.WriteLine("T={0}", typeof(T));
    }
}

class Test
{
    static void Main()
    {
        string typeName = "System.String";
        Type typeArgument = Type.GetType(typeName);

        Type genericClass = typeof(Generic<>);
        // MakeGenericType is badly named
        Type constructedClass = genericClass.MakeGenericType(typeArgument);

        object created = Activator.CreateInstance(constructedClass);
    }
}

Примечание: если ваш универсальный класс принимает несколько типов, вы должны включать запятые, когда вы опускаете имена типов, например:

Type genericClass = typeof(IReadOnlyDictionary<,>);
Type constructedClass = genericClass.MakeGenericType(typeArgument1, typeArgument2);
182
ответ дан ErikE 26 August 2018 в 00:07
поделиться
  • 1
    Ну, если вы можете уйти от того, чтобы ваш универсальный тип реализовал не общий интерфейс, вы можете использовать этот интерфейс. Кроме того, вы можете написать свой собственный общий метод, который выполняет всю работу, которую вы хотите сделать с общим, и вызовите , который с отражением. – Jon Skeet 5 November 2008 в 22:30
  • 2
    Да, я не собираюсь использовать созданные, если единственная информация, которую вы имеете о возвращаемом типе, находится в переменной типа typeArgument? Мне кажется, что вам нужно было бы использовать эту переменную, но вы не знаете, что это такое. Я не уверен, что вы можете сделать это с отражением. Другой вопрос, если объект, например, имеет тип int, если вы передаете его как переменную объекта, например, например List & lt; int & gt; с этой работой? будет ли созданная переменная рассматриваться как int? – theringostarrs 16 September 2009 в 23:37
  • 3
    @ RobertC.Barth Вы также можете создать «созданный». объект в типе примера "динамический" вместо «объекта». Таким образом, вы можете вызывать методы на нем, и оценка будет отложена до выполнения. – McGarnagle 22 April 2012 в 06:35
  • 4
    Каждый раз, когда я поддерживаю Джона Скита, я чувствую, что меня ограбили крошечную часть моей души. :( – canon 19 September 2012 в 15:02
  • 5
    @balanza: Вы используете MakeGenericMethod. – Jon Skeet 9 May 2013 в 08:37

Некоторые дополнительные способы запуска с помощью кода ножниц. Предположим, что у вас есть класс, похожий на

public class Encoder() {
public void Markdown(IEnumerable<FooContent> contents) { do magic }
public void Markdown(IEnumerable<BarContent> contents) { do magic2 }
}

Предположим, что во время выполнения у вас есть FooContent

Если вы смогли привязать во время компиляции,

var fooContents = new List<FooContent>(fooContent)
new Encoder().Markdown(fooContents)

Однако вы не можете сделать это во время выполнения. Чтобы сделать это во время выполнения, выполните следующие строки:

var listType = typeof(List<>).MakeGenericType(myType);
var dynamicList = Activator.CreateInstance(listType);
((IList)dynamicList).Add(fooContent);

Чтобы динамически вызывать Markdown(IEnumerable<FooContent> contents)

new Encoder().Markdown( (dynamic) dynamicList)

Обратите внимание на использование функции dynamic в вызове метода , Во время выполнения dynamicList будет List<FooContent> (дополнительно также IEnumerable<FooContent>), так как даже использование динамика все еще связано с строго типизированным языком, связующее время будет выбирать соответствующий метод Markdown. Если нет точных совпадений по типу, он будет искать метод параметров объекта, и если ни одно из них не будет соответствовать исключению связующего из среды выполнения, будет предупреждено о том, что метод не соответствует.

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

1
ответ дан Chris Marisic 26 August 2018 в 00:07
поделиться

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

14
ответ дан JaredPar 26 August 2018 в 00:07
поделиться

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

namespace GenericTest
{
    public class Item
    {
    }
}

namespace GenericTest
{
    public class GenericClass<T>
    {
    }
}

Наконец, вот как вы его называете. Определите тип с обратным шагом .

var t = Type.GetType("GenericTest.GenericClass`1[[GenericTest.Item, GenericTest]], GenericTest");
var a = Activator.CreateInstance(t);
2
ответ дан Nathan Tuggy 26 August 2018 в 00:07
поделиться
Другие вопросы по тегам:

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