2011-11-29 2 views
1

Мне интересно, возможно ли это. В моей функции тестирования ниже я хочуVB.NET - доступ к общему члену через тип

  1. Проверьте, если T имеет тип BaseClass; выбросьте ошибку, если это не так.
  2. Получить значение SomeText Недвижимость BaseClass.

    Class BaseClass 
    
        Public Shared Property SomeText As String 
    
    End Class 
    
    Class Class1 
        Inherits BaseClass 
    
        Public Sub New() 
         SomeText = "Class 1 here" 
        End Sub 
    
    End Class 
    

...

Sub Main 

     Test(GetType(Class1)) 
     Test(GetType(Class2)) 

    End Sub 

    Sub Test(T As Type) 

     ' Task 1: Check if T is of type BaseClass 

     ' Task 2: Get the value of SomeText property of BaseClass 

    End Sub 
+0

Вы уверены, что хотите установить значение совместно используемого элемента из конструктора экземпляра? Хотя это/может/быть правильным, это не то, что обычно видят, поэтому я просто хотел быть уверенным. «Общий Sub Новый» обычно является способом инициализации общих членов. –

ответ

1

тест Rewrite следующим образом (обновляется с учетом изменений на вопрос):

Sub Test(T As Type) 

    ' Task 1: Check if T is of type BaseClass 
    If T.IsSubclassOf(GetType(BaseClass)) Then 
     ' Task 2: Get the value of SomeText property of BaseClass 
     Dim sValue As String 
     ' Create an unused instance of BaseClass to ensure the current value of SomeText is assigned 
     Dim oClass As BaseClass = DirectCast(System.Activator.CreateInstance(T), BaseClass) 

     ' Get the value from BaseClass since it is a shared instance 
     sValue = BaseClass.SomeText 
    Else 
     Throw New ArgumentException("T did not inherit from BaseClass") 
    End If 


End Sub 
+0

Вы имеете в виду 'T As Type', и вы должны использовать' CType (Activator.CreateInstance (T), BaseClass) 'вместо' As New Class1', например D .. –

+0

@MarkHurd: На самом деле это именно то, что OP спрашивал, когда я первоначально ответил на вопрос. Они специально задавали значение класса 1, а не класса, унаследованного от BaseClass. Поскольку они изменили свой запрос, я обновлю свой ответ. –

+0

Я думаю, вы можете захотеть изменить тип параметра T на тип объекта с учетом внесенных вами изменений. – Jay

1

Вы можете сохранить тестовую подпись и сделать следующее :

If T.BaseType Is GetType(BaseClass) Then 
     Dim CurrentValue as String = BaseClass.SomeText 
    Else 
     Throw New ArgumentException("T must inherit from BaseClass") 
    End If 

Поскольку это никогда не создает экземпляр вашего типа, вы можете не получить строку, которую вы ожидаете. Если вы еще не создали экземпляр в другом месте, у вас будет только пустая строка.

Вы можете создать экземпляр вашего класса от типа вы послали, если это ваша цель:

If T.BaseType Is GetType(BaseClass) Then 
     Dim currentValue As String = CType(Activator.CreateInstance(T), BaseClass).SomeText 
    Else 
     Throw New ArgumentException("T must inherit from BaseClass") 
    End If 

Редактировать на основе комментария о дальнейших подклассах:

Если вы хотите, чтобы включить базу типа или любых потомков, вы можете использовать это, если вместо этого:

If T Is GetType(EventBase) OrElse T.IsSubclassOf(GetType(EventBase)) Then 

    End If 
+0

Использование Type.BaseType будет ломаться, если BaseClass подклассы (например, BaseClassSub) и Class1 будут изменены для наследования из этого нового подкласса. В этом случае Class1 по-прежнему является подклассом BaseClass, только один уровень удален из прямого наследования. –

+0

Я думал, что это была его цель. Ред. – Jay

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