Определение констант в проекте Define Constant

96
28 марта 2022, 14:50

Есть 2 проекта. Вложенный проект имеет 2 модели: Model1in и Model1Out.

namespace Test.Nested
{
    public class Model1in
    {
#if NATIVE
        public static explicit operator Model1in(Model1Out model)
        {
            return model == null ? null : new Model1in();
        }
#endif
    }
    public class Model1Out
    {
#if NATIVE
        public static explicit operator Model1Out(Model1in model)
        {
            return model == null ? null : new Model1Out();
        }
#endif     
}

В другом проекте я хочу привести одну модель к другой но с указанием директивы.

#define NATIVE
namespace Test.Native
{
     ....
     Model1Out model = (Model1Out)Model1in;
}

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

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <DefineConstants>DEBUG;NATIVE</DefineConstants>
</PropertyGroup>
 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
    <TreatWarningsAsErrors>True</TreatWarningsAsErrors>
    <TreatSpecificWarningsAsErrors />
    <DefineConstants>NATIVE;Release</DefineConstants>
  </PropertyGroup>
<PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <DefineConstants>RELEASE;DEBUG;NATIVE</DefineConstants>
    <Configurations>Debug;Release;NATIVE</Configurations>
  </PropertyGroup>
Answer 1

На сколько я понял, Ваш проект Test.Nested не знает ничего о "NATIVE" Оставив код как есть в этом классе

namespace Test.Nested
{
    public class Model1in
    {
#if NATIVE
        public static explicit operator Model1in(Model1Out model)
        {
            return model == null ? null : new Model1in();
        }
#endif
    }
    public class Model1Out
    {
#if NATIVE
        public static explicit operator Model1Out(Model1in model)
        {
            return model == null ? null : new Model1Out();
        }
#endif     
}

но определив констаннты в проекте (*.csproj)

 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <DefineConstants>TRACE;NATIVE</DefineConstants>
  </PropertyGroup>

Вы позволяете ему работать с ними.

Эту же констатнту Вы должны объявить в первом проекте, где используете преоброзование (Test.Native).

Вот только код

#define NATIVE
namespace Test.Native
{
     ....
     Model1Out model = (Model1Out)Model1in;
}

имеет ошибку. Вы можете преоброзовать объект, а не его тип

 var test = new Model1in();
      Model1Out model = (Model1Out)test;

UPDATE: Полный пример:

Test.Nested определяем NATIVE

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <DefineConstants>TRACE;NATIVE</DefineConstants>
  </PropertyGroup>
</Project>

Конвертер:

namespace Test.Nested
{
    public class Model1in
    {
#if NATIVE
        public static explicit operator Model1in(Model1Out model)
        {
            return model == null ? null : new Model1in();
        }
#endif
    }
    public class Model1Out
    {
#if NATIVE
        public static explicit operator Model1Out(Model1in model)
        {
            return model == null ? null : new Model1Out();
        }
#endif     
}

Test.Native определяем NATIVE для второго проекта

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <DefineConstants>TRACE;NATIVE</DefineConstants>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="..\ClassLibrary1\Test.Nested.csproj" />
  </ItemGroup>
</Project>

Активируем NATIVE (ставим значени в true):

#define NATIVE
using System;
using Test.Nested;
namespace Test.Native
{
  class Program
  {
    static void Main(string[] args)
    {
      var test = new Model1in();
      var model = (Model1Out)test;
      Console.WriteLine("Hello World!");
    }
  }
}
READ ALSO
Наследование от обобщенного класса с IEnumerator

Наследование от обобщенного класса с IEnumerator

Вопрос больше теоретическийНо буду признателен и за практическое решение, а дальше, на его основе, смогу додумать

74
Многоуровневая архетектура(Class Library)

Многоуровневая архетектура(Class Library)

Пусть нужно сделать проект с многоуровневой архитектуройКак и в каких случаях нужно делать так: Class Libraries: Entites, DLayer, DTO,BLayer, Presenttion Layer, Core или...

90
DataGridView с датами

DataGridView с датами

Есть таблица

165