Результаты поиска
Как создать новый экземпляр объекта из типа
Можно не всегда знать Type объекта во время компиляции, но может потребоваться создать экземпляр Type . Как получить новый экземпляр объекта из Type ?
Как я могу динамически оценивать код C#?
Я могу сделать eval("something()"); , чтобы выполнить код динамически в JavaScript. Есть ли способ для меня сделать то же самое в C#?
Пример того, что я пытаюсь сделать: у меня есть целочисленная переменная (скажем, i), и у меня есть несколько свойств по именам: "Property1", "Property2", "Property3" и т. д.
Теперь я хочу выполнить некоторые операции над свойством "Property i " в зависимости от значения i .
Это действительно просто с Javascript. Есть ли какой-нибудь способ сделать это с C#?
Программный доступ к стеку вызовов в .чистая
Как я могу получить программный доступ к стеку вызовов?
Кто-нибудь знает быстрый способ добраться до пользовательских атрибутов по значению 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# в текущей assembly с определенным именем?
У меня есть интерфейс под названием IStep , который может выполнять некоторые вычисления (см. " Выполнение в Царстве существительных "). Во время выполнения я хочу выбрать соответствующую реализацию по имени класса.
// use like this: IStep step = GetStep(sName);
Алгоритм для выполнения вычисления 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 я могу упростить весь процесс. Дай мне попробовать.
Насколько дорого стоит .NET отражение?
Я постоянно слышу, как плохо использовать отражение. Хотя я обычно избегаю размышлений и редко нахожу ситуации, когда без них невозможно решить мою проблему, мне было интересно...
Для тех, кто использовал отражение в приложениях, вы измерили хиты производительности и, действительно ли это так плохо?
Как перехватить вызов метода в 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: каким будет решение, если мне будет разрешено немного изменить метод вызова?
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" способом достижения цели?
Получение всех типов, реализующих интерфейс
Используя отражение, как я могу получить все типы, которые реализуют интерфейс с C# 3.0/.NET 3.5 с наименьшим количеством кода и минимизацией итераций?
Вот что я хочу переписать:
foreach (Type t in this.GetType().Assembly.GetTypes())
if (t is IMyInterface)
; //do stuff
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