2010-11-30 6 views
0

У меня возникают проблемы с преобразованием vb.net в C# .net.Преобразовать вызов статического метода vb.net на объект

У меня есть файлы в vb.net, у которых есть опция «Strict Off», чтобы обеспечить плохое программирование. Когда я конвертировать в C# я использую «динамический», пока я не вернусь и устранить проблемы, и это работает во всех случаях

Но теперь у меня есть этот код:

Public Class ContractResults 
    'Big class definition 
    Public Shared Sub CleanCache() 
     'Code here 
    End Sub 
End Class 

И в файле с Option Strict Off :

Public Sub VerifyResults(result as Object) 
    'Here, result is normally ContractResults 
    'first it check for that then call this: 
    result.CleanCache() 
End Sub 

В C# я использую «динамический», но ошибка во время выполнения появляется, когда я называю «статический» метод с динамической ссылкой. В vb.net, я могу назвать «общий» к югу от экземпляра, но в C# это не допускается

Исключение: «Microsoft.CSharp.RuntimeBinder.RuntimeBinderException» «пользователь„ContractTypes.ContractResults.CleanCache()“ не могут быть доступны с ссылкой на экземпляр, вместо этого присвойте ему имя типа «

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

Я хочу, чтобы убедиться, что вы не думаете, что я могу использовать

(result as ContractResults).CleanCache(); 

Поскольку все типы, которые могут быть переданы в есть метод «CleanCache()», но не наследует от всего того же, кроме " Объект». Существует много типов (30!), Которые имеют этот «статический» метод и поэтому используют параметр Strict Off

+1

Для 30 типов я просто включил опцию Strict On и исправлю ее в VB. IDE предоставит вам предупреждения для каждого, и вы сможете проделать все довольно быстро. – 2010-11-30 19:23:03

ответ

2

Вы можете использовать reflection:

result.GetType().InvokeMember("CleanCache", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy, null, null, new object[0]); 

(непроверенные)

+0

Эта работа: мне пришлось добавить «BindingFlags.InvokeMember». Одна из проблем в цикле, в которой это работает, похоже, замедляет код, но мне нравится преобразование - преобразование плохого кода становится плохо преобразованным кодом, на мой взгляд. Я бы проголосовал, но я недостаточно хороший пользователь. – 2010-11-30 19:24:51

+1

Да, это временное решение, которое ждет очистки. – dtb 2010-11-30 19:25:44

1

Как следует из этой ошибки, вы должны вызвать статический метод из класса, а не экземпляр:

ContractResults.CleanCache(); 

Вы можете ввести 30 типов в оператор switch, но это было бы уродливо.

1

Мне жаль это говорить, но оригинальное решение, чтобы включить Option Strict Off был плохой. Почему-то я сомневаюсь, что код, который был изначально написан, делает то, что, по вашему мнению, он делает.

Пришло время просто исправить эту проблему.

Смежные вопросы