Есть 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>
На сколько я понял, Ваш проект 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!");
}
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Вопрос больше теоретическийНо буду признателен и за практическое решение, а дальше, на его основе, смогу додумать
Пусть нужно сделать проект с многоуровневой архитектуройКак и в каких случаях нужно делать так: Class Libraries: Entites, DLayer, DTO,BLayer, Presenttion Layer, Core или...