Можно ли использовать методы дженериков в C#, если тип неизвестен до времени выполнения?

Вы хотите StructLayoutAttribute

[StructLayout(LayoutKind.Explicit, Size=1, CharSet=CharSet.Ansi)]
public struct Foo 
{ [FieldOffset(0)]public byte original_or_copy; 
  [FieldOffset(0)]public byte copyright;
  [FieldOffset(0)]public byte data_alignment_indicator; 
  [FieldOffset(0)]public byte PES_priority; 
  [FieldOffset(0)]public byte PES_scrambling_control; 
  [FieldOffset(0)]public byte reserved; 
}

Это действительно объединение, но вы можете использовать его как битовое поле - вам просто нужно знать, где в байте бит для каждого поля. Полезные функции и / или константы для AND могут помочь.

const byte _original_or_copy = 1;
const byte _copyright        = 2;

//bool ooo = foo.original_or_copy();
static bool original_or_copy(this Foo foo) 
{ return  (foo.original_or_copy & _original_or_copy)  == original_or_copy;
}    

Существует также LayoutKind.Sequential, который позволит вам сделать это способом C.

17
задан jerryjvl 12 June 2009 в 14:51
поделиться

3 ответа

Можно использовать отражение. Принятие текущего объекта содержит SomeMethod() метод, код, чтобы сделать так был бы похож на это:

GetType().GetMethod("SomeMethod").
    MakeGenericMethod(new Type[] { someType }).Invoke(this, null);

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

23
ответ дан 30 November 2019 в 10:46
поделиться

Единственный способ сделать это сегодня через отражение. См. MethodInfo. MakeGenericMethod (Тип []) .

3
ответ дан 30 November 2019 в 10:46
поделиться

, Почему не делает C#, позволяют, чтобы это было легальным оператором?

, Поскольку другие отметили, Вы не можете сделать этого. Почему нет? Ну, рассмотрите свой пример:

foreach(Type someType in listOfTypes)
{
    SomeMethod<someType>();
}

Уведомление, что каждый тип в списке типов не может быть известен до время выполнения , тогда как параметр типа SomeMethod должен быть известен в время компиляции . Для компилятора невозможно сказать , к которому SomeMethod<T> для разрешения вызова, таким образом, это недопустимо.

В C# 4, это и много других подобных вещей будут возможны с включением ДОЛЛАРА в CLR. В частности, динамический вызов метода позволит Вам вызвать методы, которые не могут быть известны во время компиляции.

23
ответ дан 30 November 2019 в 10:46
поделиться
Другие вопросы по тегам:

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