powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как привести тип?
7 сообщений из 7, страница 1 из 1
Как привести тип?
    #38403072
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Enum EnTest
   etItem1 = 1
   etItem2 = 2
End Enum

Dim x As Integer = 1
Dim t as System.Type = SomeObject.Type  'содержит GetType(EnTest)

Function Test(x as Object) 'сюда должен попасть тип EnTest, а не Integer

Можно ли привести x к EnTest, имея только t и не имея возможности написать DirectCast(x, EnTest)?
...
Рейтинг: 0 / 0
Как привести тип?
    #38403131
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вы сами-то понимаете... зачем вам это нужно???
...
Рейтинг: 0 / 0
Как привести тип?
    #38403145
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

на C#

int i = (int)EnTest.etItem1
...
Рейтинг: 0 / 0
Как привести тип?
    #38403148
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VIT2708,

не обращай внимания протупил
...
Рейтинг: 0 / 0
Как привести тип?
    #38403159
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,
Код: vbnet
1.
2.
3.
4.
Imports System.ComponentModel
...
Dim ec As New EnumConverter(t)
Test(ec.ConvertFromString(x))


Вопрос только зачем такое может понадобиться?
...
Рейтинг: 0 / 0
Как привести тип?
    #38403321
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazileВопрос только зачем такое может понадобиться?У меня богатая фантазия :)

С помощью языка разметки на базе XML я по определенным признакам делаю срез программного интерфейса проекта:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<NML:TEMPLATE xmlns:NML="http://tempuri.org/NiceML">
  <NML:BLOCK TAG ="App">
    <NML:ENU SOURCE="ProjectItems" TAG="Classes">
        <NML:ENU SOURCE="CodeElements" WHERE="Kind=1">
          <NML:VAR NAME="HasAttribute">
            <NML:ENU SOURCE="CodeAttributes" WHERE="Name=@0 and Value=@1" FILTER="TSReflect;ClassTypes.ctBusinessLayer" TAKE="1">1</NML:ENU>
          </NML:VAR>
          <NML:IF FIELD="?HasAttribute" SIGN="EQUAL" CONDITION="1">
            <NML:BLOCK TAG="{NML:GET FIELD='Name' /}"> <!-- класс -->
              <NML:ENU SOURCE="CodeElements" WHERE="Kind=1 and Access = 1"><!-- публичные методы -->
                <NML:BLOCK TAG="{NML:GET FIELD='Name' /}"> 
                  <NML:ATTR NAME="Type"><NML:GET FIELD="Type"/></NML:ATTR> <!-- возвращаемый тип -->
                  <NML:ENU SOURCE="CodeElements"> <!-- аргументы -->
                    <NML:ATTR NAME="{NML:GET FIELD='Name' /}"><NML:GET FIELD="Type"/></NML:ATTR>
                  </NML:ENU>
                </NML:BLOCK>
              </NML:ENU>
            </NML:BLOCK>
          </NML:IF>
        </NML:ENU>
    </NML:ENU>
  </NML:BLOCK>
</NML:TEMPLATE>

В результате получаю примерно такой документ (члены классов пока не вывелись):
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<App>
  <Classes>
    <Response />
    <Rowset />
    <ToolbarMenu />
    <Toolbar />
    <BTError />
    <SelectData />
    <Field />
    <Catalogue />
    <Files />
    <Message />
    <Organizations />
    <Production />
  </Classes>
</App>

Далее, используя xsl, я могу генерировать говнокод, работающий с этим интерфейсом, на любом языке (лично меня интересует TypeScript). Шаблонирование же круче, чем такой хардкод, например:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
        If Not pi.FileCodeModel Is Nothing Then
            For Each ce As CodeElement In pi.FileCodeModel.CodeElements
                If ce.Kind = vsCMElement.vsCMElementClass Then
                    For Each ca As CodeAttribute In CType(ce, CodeClass2).Attributes
                        If ca.Name = "TSReflect" Then
                            If ca.Value.Substring(InStrRev(ca.Value, ".")) = "ctBusinessLayer" Then
                                If Not sbLayer Is Nothing Then
                                    sbLayer.AppendLine(vbTab & "export module " & ce.Name & " {")
                                    sbLayer.AppendLine(vbTab & vbTab & "var objName:string = '" & ce.Name & "';")
                                    Dim col As New Collection
                                    CreateLayerFuncSource(ce, sbLayer, col)
                                    sbLayer.AppendLine(vbTab & "}")
                                    sbLayer.AppendLine()
                                End If
                            Else
                                If Not sbTransport Is Nothing Then CreateTransportSource(ce, sbTransport, Nothing)
                            End If
                        End If
                        If mbCancel Then Return
                    Next
                End If
            Next
        End If

Элемент NML:ENU является декларированием LINQ-запроса к Enumerable, то есть L2O. В качестве прослойки между XML и L2O использую DynamicLINQ, который позволяет делать запросы типа Enumerable.AsQueryable.Where("Property=@0",value). И вот тут возникает засада, когда нужно написать условие к Enum-свойству. Если значение, с которым нужно сравнить свойство, передавать в DLINQ из managed-кода, то проблем нет, передал какой-нибудь vsCMElement.vsCMElementClass и все ок. Но в XML-шаблоне это не проканает. Если написать WHERE="Kind=vsCMElement.vsCMElementClass", то построитель запроса будет считать, что vsCMElement это свойство объекта, к коллекции которых составляется запрос. Если написать WHERE="Kind=1", то выскочит ошибка, что невозможно сравнить выражения типа vsCMElement и Int32. Если написать WHERE="Kind=@0" FILTER="1", то будет та же ошибка о невозможности сравнить со string'ом или тем же Int32, если значение FILTER сделать числом.

Но в том участке DLINQ, где происходит это сравнение, присутствует ссылка на тип свойства (vsCMElement), поэтому есть возможность привести число к этому типу до сравнения. На данный момент сделал поддержку WHERE="Kind=1" и решил это так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
                            If oType.IsEnum Then
                                Dim v As Object = Nothing
                                For Each v In type.GetEnumValues
                                    If CInt(v) = CInt(value) Then Exit For
                                Next
                                Return Expression.Constant(v, type)
                            Else
                                Return Expression.Constant(value, type)
                            End If

ConvertFromString пригодится для поддержки передачи значения через FILTER.
...
Рейтинг: 0 / 0
Как привести тип?
    #38404679
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работаю с коллекциями, которые поддерживают IEnumerable, но не поддерживают IQueryable, так что нужно пройтись по ним и перекинуть объекты в List, например. Но List(Of Object) не подходит, LINQ при выполнении запроса говорит, что у Object нет фильтруемого свойства.

Вопрос: можно ли создать типизированный список годный для IQueryable, имея лишь System.Type?
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как привести тип?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]