У меня есть некоторый библиотечный код , который работает в диапазоне времени выполнения .NET (обычный, CF, Silverlight и т. Д.), Но небольшой блок кода нарушает только на CF 2.0, с MethodAccessException
. Я почти уверен, что это ошибка во время выполнения, но кто-нибудь знает какие-нибудь хорошие обходные пути? Он отлично работает в CF 3.5, но мне нужно иметь возможность поддерживать и CF 2.0.
В частности, это относится к сборке библиотеки с использованием обобщенных типов, которой вызывающая сторона предоставляет не публичный T
. Я не делаю ничего противного T
(например, отражения), но он все равно ломается ...
Все, что он делает, это оборачивает значения и добавляет их в список,
затем отсортируйте список через Comparison<>
. Я также пытался Array.Sort
,
IComparer<Wrapper<T>>
, IComparable<Wrapper<T>>
и т. Д. - все
терпеть неудачу таким же образом: MethodAccessException
-
с наконечником VS:
Если уровень доступа метода в
библиотека классов изменилась, перекомпилируйте
любые сборки, которые ссылаются на
библиотека.
Но сделайте T
общедоступным, и все это прекрасно работает ... обратите внимание, что мы никогда не сортировали по T
- мы работали только с Wrapper<T>
...
Любой вклад приветствуется ...
Сборка библиотеки:
public static class LibraryClass
{
public static void Test<T>(T foo, T bar)
{
// vastly simplified... I am aware that it is already in order here ;-p
var list = new List<Wrapper<T>>();
list.Add(new Wrapper<T> { Tag = 1, Value = foo });
list.Add(new Wrapper<T> { Tag = 2, Value = bar });
list.Sort((x,y) => x.Tag.CompareTo(y.Tag)); // BOOM!!
}
}
public class Wrapper<T> // public to prove this isn't a factor...
{
public T Value { get; set; }
public int Tag { get; set; }
}
Вызывающая сборка:
public static class Program
{
static void Main()
{
MyData foo = new MyData {Name = "foo"},
bar = new MyData {Name = "bar"};
LibraryClass.Test<MyData>(foo, bar);
}
}
class MyData // but make MyData public and it works...
{
public string Name { get; set; }
}