Найдено результатов: 11

Как создать новый экземпляр объекта из типа

Можно не всегда знать Type объекта во время компиляции, но может потребоваться создать экземпляр Type . Как получить новый экземпляр объекта из Type ?

c#   .net   performance   reflection   types    

576   12   16:03, 1st July, 2020


Как я могу динамически оценивать код C#?

Я могу сделать eval("something()"); , чтобы выполнить код динамически в JavaScript. Есть ли способ для меня сделать то же самое в C#?

Пример того, что я пытаюсь сделать: у меня есть целочисленная переменная (скажем, i), и у меня есть несколько свойств по именам: "Property1", "Property2", "Property3" и т. д. Теперь я хочу выполнить некоторые операции над свойством "Property i " в зависимости от значения i .

Это действительно просто с Javascript. Есть ли какой-нибудь способ сделать это с C#?

c#   reflection   properties   c#-2.0    

511   16   16:03, 1st July, 2020


Программный доступ к стеку вызовов в .чистая

Как я могу получить программный доступ к стеку вызовов?

.net   reflection   callstack    

408   3   23:31, 2nd August, 2020


Кто-нибудь знает быстрый способ добраться до пользовательских атрибутов по значению enum?

Это, вероятно, лучше всего показать на примере. У меня есть перечисление с атрибутами:

public enum MyEnum {

    [CustomInfo("This is a custom attrib")]
    None = 0,

    [CustomInfo("This is another attrib")]
    ValueA,

    [CustomInfo("This has an extra flag", AllowSomething = true)]
    ValueB,
}

Я хочу добраться до этих атрибутов из экземпляра:

public CustomInfoAttribute GetInfo( MyEnum enumInput ) {

    Type typeOfEnum = enumInput.GetType(); //this will be typeof( MyEnum )

    //here is the problem, GetField takes a string
    // the .ToString() on enums is very slow
    FieldInfo fi = typeOfEnum.GetField( enumInput.ToString() );

    //get the attribute from the field
    return fi.GetCustomAttributes( typeof( CustomInfoAttribute  ), false ).
        FirstOrDefault()        //Linq method to get first or null
        as CustomInfoAttribute; //use as operator to convert
}

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

У кого-нибудь есть лучший способ?

c#   .net   reflection   enums   attributes    

489   2   16:38, 3rd August, 2020


Как найти реализацию интерфейса C# в текущей assembly с определенным именем?

У меня есть интерфейс под названием IStep , который может выполнять некоторые вычисления (см. " Выполнение в Царстве существительных "). Во время выполнения я хочу выбрать соответствующую реализацию по имени класса.

// use like this:
IStep step = GetStep(sName);

c#   linq   reflection   linq-to-objects    

472   4   13:29, 21st August, 2020


Алгоритм для выполнения вычисления RFC в Java

RFC для класса Java-это набор всех методов, которые могут быть вызваны в ответ на сообщение объекту класса или каким-либо методом в классе. RFC = M + R, где M = количество методов в классе. R = общее число других методов, непосредственно вызываемых из M.

Мышление C-это то .класс и J-это то .java файл, из которого нам нужно вычислить RFC.

class J{

 a(){}
 b(){}
 c(){
   e1.e();
   e1.f();
   e1.g();
 }
 h(){
   i.k();
   i.j();
  }
  m(){}
  n(){
   i.o();
   i.p();
   i.p();
   i.p();
  }
}

здесь M=6 и R=9 (Не беспокойтесь о вызове внутри цикла. Это рассматривается как один вызов)

Вычисление M легко. Загрузите C с помощью загрузчика классов и используйте отражение, чтобы получить количество методов.

Вычисление R не является прямым. Нам нужно подсчитать количество вызовов метода из класса. Только первый уровень.

Для вычисления R я должен использовать regex. Обычно формат будет (вызовы без использования . не учитываются)

[variable_name].[method_name]([zero or more parameters]);

или

[variable_name].[method_name]([zero or more parameters])

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

[variable_name].[method_name]([zero or more parameters]).method2();

это становится двумя вызовами метода

Какие еще шаблоны вызова метода вы можете придумать? Есть ли другой способ, кроме использования RegEx, который может быть использован для вычисления R.


UPDATE:
@McDowell похоже, что с помощью BCEL я могу упростить весь процесс. Дай мне попробовать.

java   regex   algorithm   reflection    

556   4   20:01, 19th August, 2020


Насколько дорого стоит .NET отражение?

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

Для тех, кто использовал отражение в приложениях, вы измерили хиты производительности и, действительно ли это так плохо?

c#   .net   performance   reflection    

442   13   08:33, 21st August, 2020


Как перехватить вызов метода в C#?

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

Как я могу это сделать предполагая что:

  • Я не хочу использовать какую-либо третью сторону AOP библиотеки для C#,
  • Я не хочу добавлять дубликат кода ко всем методам, которые я хочу trace,
  • Я не хочу изменять public API класса - пользователи класса должны иметь возможность вызывать все методы точно таким же образом.

Чтобы сделать вопрос более конкретным предположим что есть 3 класса:

 public class Caller 
 {
     public static void Call() 
     {
         Traced traced = new Traced();
         traced.Method1();
         traced.Method2(); 
     }
 }

 public class Traced 
 {
     public void Method1(String name, Int32 value) { }

     public void Method2(Object object) { }
 }

 public class Logger
 {
     public static void LogStart(MethodInfo method, Object[] parameterValues);

     public static void LogEnd(MethodInfo method);
 }

Как вызвать Logger.LogStart и Logger.LogEnd для каждого вызова Method1 и Method2 без изменения метода Caller.Call и без добавления вызовов явно в Traced.Method1 и Traced.Method2 ?

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

c#   reflection   aop    

519   15   08:44, 22nd August, 2020


Python отражение супер класса

Если у меня есть код Python

class A():
    pass
class B():
    pass
class C(A, B):
    pass

и у меня есть класс C , есть ли способ перебрать его супер-класс (A и B)? Что-то вроде псевдокода:

>>> magicGetSuperClasses(C)
(<type 'A'>, <type 'B'>)

Одним из решений, по-видимому, является модуль inspect и функция getclasstree .

def magicGetSuperClasses(cls):
    return [o[0] for o in inspect.getclasstree([cls]) if type(o[0]) == type]

но является ли это "Pythonian" способом достижения цели?

python   reflection    

437   4   07:44, 6th August, 2020


Получение всех типов, реализующих интерфейс

Используя отражение, как я могу получить все типы, которые реализуют интерфейс с C# 3.0/.NET 3.5 с наименьшим количеством кода и минимизацией итераций?

Вот что я хочу переписать:

foreach (Type t in this.GetType().Assembly.GetTypes())
    if (t is IMyInterface)
        ; //do stuff

c#   optimization   reflection   lambda   c#-3.0    

460   13   14:02, 11th August, 2020


Compact Framework-как динамически создать тип без конструктора по умолчанию?

Я использую .NET CF 3.5. Тип, который я хочу создать, не имеет конструктора по умолчанию, поэтому я хочу передать строку перегруженному конструктору. Как мне это сделать?

Код:

Assembly a = Assembly.LoadFrom("my.dll");
Type t = a.GetType("type info here");
// All ok so far, assembly loads and I can get my type

string s = "Pass me to the constructor of Type t";
MyObj o = Activator.CreateInstance(t); // throws MissMethodException

c#   reflection   compact-framework    

479   4   15:02, 5th August, 2020