Динамический контроль типов в C#

Я не согласен с тем, что встроенные функции всегда быстрее. Функции косинуса намного быстрее и точнее, чем все, что я мог написать. Что касается Pow (). Я сделал быстрый тест, чтобы увидеть, насколько медленным был Math.pow () в javascript, потому что Мехрдад предостерегал от догадок

    for (i3 = 0; i3 < 50000; ++i3) { 
      for(n=0; n < 9000;n++){ 
        x=x*Math.cos(i3);
      }
    }

вот результаты:

Each function run 50000 times 

time for 50000 Math.cos(i) calls = 8 ms 
time for 50000 Math.pow(Math.cos(i),9000) calls = 21 ms 
time for 50000 Math.pow(Math.cos(i),9000000) calls = 16 ms 
time for 50000 homemade for loop calls 1065 ms

Не согласитесь, попробуйте программу на http://www.m0ose.com/javascripts/speedtests/powSpeedTest.html

7
задан WedTM 4 June 2009 в 16:22
поделиться

7 ответов

Кажется, вам не хватает очевидного решения:

object obj = new object();
MyType typObj = new MyType();
obj = typObj;
List<MyType> list = new List<MyType>();
list.Add((MyType) obj);

Если вам действительно нужен динамический маршрут, вы можете сделать что-то вроде этого:

object obj = new object();
MyType typObj = new MyType();
obj = typObj;
Type objType = typObj.GetType();

Type listType = typeof(List<>);
Type creatableList = listType.MakeGenericType(objType);

object list = Activator.CreateInstance(creatableList);
MethodInfo mi = creatableList.GetMethod("Add");
mi.Invoke(list, new object[] {obj});
10
ответ дан 7 December 2019 в 01:25
поделиться

Вам нужно отражение:

constructor = typeof (MyType).GetConstructor () // doing this from memory, the typeof might be wrong, I'm sure someone will edit it
typObj = (MyType) constructor.Invoke ()

Это также можно сделать для дженериков, но это немного сложнее.

1
ответ дан 7 December 2019 в 01:25
поделиться

Вы можете сделать что-то подобное с помощью Generics, хотя я не совсем уверен, в чем смысл этого.

public List<T> TypedList<T>() where T : new()
{
    object obj = new object();
    T typObj = new T();
    obj = typObj;
    List<T> list = new List<T>();
    list.Add((T)obj);
    return list;
}
1
ответ дан 7 December 2019 в 01:25
поделиться
object obj = new object();
Type objType = obj.GetType();
IList list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(objType));
list.Add(obj);

При этом вы получите ошибку времени выполнения, если попытаетесь поместить в список что-то, что не может быть назначено из objType.

0
ответ дан 7 December 2019 в 01:25
поделиться

Быстрее было бы использовать Reflection.Emit Вот простой пример использования Reflection.Emit для создания экземпляра произвольного конкретного типа во время выполнения. Для ваших целей вам просто нужно, чтобы он вызывал ctor List вместо T.ctor, как в примере.

0
ответ дан 7 December 2019 в 01:25
поделиться

Я не совсем уверен, что вы пытаетесь сделать, но сработает ли это:

var obj = new MyType ();

Возможно, я неправильно понял ваш вопрос.

(Я отредактировал это, чтобы исправить пример кода, который не компилируется, спасибо за комментарий)

-2
ответ дан 7 December 2019 в 01:25
поделиться

Even though it seems answered, I still don't get it :)

Wouldn't it be useful to have the "typeToReturn" as generic argument to the function?

public List<T> SingleNodeCollection<T>(String xPath, XPathNavigator navigator)
  where T : new()
{
  XPathNodeIterator nodes = navigator.Select(xPath);
  List<T> returnedList = new List<T>(nodes.Count);
  ...
  T newObj = new T();
  ...
  Type t = typeof(T); // need the type anyway?
}
0
ответ дан 7 December 2019 в 01:25
поделиться
Другие вопросы по тегам:

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