Следующий код основан на этом вопросе и ответах StackOverflow :
/// <summary>
/// Computes the size of the given managed type. Slow, but reliable. Does not give the same result as Marshal.SizeOf
/// NOTE: this is not the same as what is the distance between these types in an array. That varies depending on alignment.
/// </summary>
public static int ComputeSizeOf(Type t)
{
// all this just to invoke one opcode with no arguments!
var method = new DynamicMethod("ComputeSizeOfImpl", typeof(int), Type.EmptyTypes, typeof(Util), false);
var gen = method.GetILGenerator();
gen.Emit(OpCodes.Sizeof, t);
gen.Emit(OpCodes.Ret);
var func = (Func<int>)method.CreateDelegate(typeof(Func<int>));
return func();
}
Я думаю, что вопрос, который вам, вероятно, интересует, заключается не в том, какой размер шрифта, аэто расстояние между двумя смежными элементами в списке.Это потому, что выравнивание может играть роль, как уже упоминалось другими.
Я полагаю, что решение этой проблемы лучше всего было бы достигнуть с помощью Marshal.UnsafeAddrOfPinnedArrayElement()
, но его очень сложно использовать правильно, особенно потому, что List
не предоставляет публично доступ к массиву поддержки.