2013-02-22 3 views
1

В моем проекте .NET MVC у меня есть модель под названием User, класс whoose конфликтует с System.Security.Principal.IPrincipal.WebPageRenderingBase.User, когда я нахожусь в режиме бритвы. (и только внутри бритвы).Можно ли удалить или разрешить конфликты из пользовательского класса .NET?

Есть ли способ дать моему классу другой глобальный псевдоним? или еще лучше, перестать показывать этот класс .NET?

Я не хочу подробного решения. (prefixing) есть способ ссылки на это глупое свойство пользователя?

Это обычная проблема для всех или что-то не так с моей настройкой?

+0

См. Первый комментарий к нижеприведенному ответу. Это ваш ответ. –

+0

Да, я знаю, но я хотел бы посмотреть на лучшее решение, что псевдоним работает хорошо, но вы должны сделать это в каждом бритве. – Baconbeastnz

+6

Лучшим решением, IMHO, является переименование вашего класса. –

ответ

4

Полностью квалифицировать ваш класс т.е.

MyNamespace.Core.User 

, а не просто

User 

Хотя я немного смущен, потому что

System.Security.Principal.IPrincipal.WebPageRenderingBase.User 

Является ли это свойство типа IPrincipal не тип User

+3

Кроме того, если вам нужен конкретный класс только в одном файле, вы можете использовать его вверху: 'using ClassName = Fully.Qualified.Namespace.ClassName;' и он будет предполагать на весь срок действия этого файла, что неквалифицированные ссылки на ' ClassName' относятся к указанному вами классу. –

+0

: О, это супер аккуратно! Не имел представления! – FlyingStreudel

+0

Возможно, это конфликт с свойством 'User' для кода, который выполняется в классе, полученном из' WebPageRenderingBase' – CodesInChaos

1

Возможно, великий Джон Скит имеет свой ответ:

"What use is the Aliases property of assembly references in Visual Studio 8":

Это для "Экстерн псевдонимами". Предположим, вы хотите использовать два разных типа , оба из которых называются Foo.Bar (т. Е. Bar в пространстве имен Foo). Эти два типа будут находиться в разных сборках (по определению) - используется свойство в VS, чтобы связать псевдоним с каждой ссылкой, , то вы можете сделать:

extern alias FirstAlias; 
extern alias SecondAlias; 

using FirstBar = FirstAlias::Foo.Bar; 
using SecondBar = SecondAlias::Foo.Bar; 

, а затем использовать FirstBar и SecondBar в коде ,

Так что в основном это дополнительный уровень именования - и вы не должны использовать его , если вам действительно не нужно. Это смутит многих людей. Старайтесь избегать попадания в эту ситуацию в первую очередь - но будьте осведомлены об этом решении в те времена, когда вы просто не можете этого избежать.

+2

У этого пользователя нету этой проблемы. У них есть класс с именем «Пользователь», конфликтующий с пользователем * member * с именем user, а не с другим классом. –

+0

Герм, я думаю. Никогда не использовал Razor Views, но я бы подумал, что это именно то, что он искал. Благодарю. – antiduh

+0

Не имел никакого отношения к Бритве; что вы размещаете для обработки классов с тем же именем и пространством имен. Это вовсе не проблема ОП. –

4

Я обычно делать что-то вроде следующего:

using m = MyProject.MyNameSpace.MySubNameSpace; 

var u = new m.User(); 
12

Просто переименуйте свой класс модели из User в Person. Каждое решение раздувает ваш код с ненужной сложностью.

Другое дело: Если вы используете класс под названием User 99% уверены, что вы используете свои модели в представлениях, где лучший подход с использованием ViewModel, где вы собираете все данные нужно передать на ваш взгляд , Таким образом, пользователь должен стать одним из свойств этого ViewModel.

Этот подход также поможет вам искоренить использование ViewBags и аналогичных ...

+0

А я использую Viewmodels во взглядах благодаря tho! :-) Я просто не создаю Viewmodel для представления, если он ему не нужен. – Baconbeastnz

+0

Спасибо также за рекомендацию! Я могу взглянуть на это, конечно, это означает, что мне придется изменить маршруты от человека -> пользователя, который немного раздражает. Hmph !!, почему на земле есть свойство, называемое пользователем, выставленное в бритвенных взглядах, кажется мне глупым! – Baconbeastnz

+0

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

4

Это несколько сочетание ответов @devlife и @Romias.

Осуществляя using псевдоним вы можете «переименовать» (в файле это определено в) ваш User класс к чему-то вы укажете в using отчетности.

Например:

using Person = NameSpace.SubNameSpace.Classes.User 

Затем вы можете использовать Person в качестве User класса в файле, что этот псевдоним определен в

См:. http://msdn.microsoft.com/en-us/library/sf0df423(v=vs.71).aspx

Последний раздел содержит полный пример кода.

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