Otrzymuję komunikat o błędzie:
„obiekt” nie zawiera definicji „tytułu”
cały kod jest również włączony githubie
Mam ConsoleApplication1, która wygląda tak
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Movie m = new Movie();
var o = new { Title = "Ghostbusters", Rating = "PG" };
Console.WriteLine(m.PrintMovie(o));
}
}
}
i Movie.cs
public class Movie : DynamicObject
{
public string PrintMovie(dynamic o)
{
return string.Format("Title={0} Rating={1}", o.Title, o.Rating);
}
}
działa dobrze z projektu SAME, ale jeśli dodam ConsoleApplication2 z odwołaniem do ConsoleApplication1 i dodam dokładnie ten sam kod
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Movie m = new Movie();
var o = new { Title = "Ghostbusters", Rating = "PG" };
Console.WriteLine(m.PrintMovie(o));
}
}
}
Pojawia się błąd:
„obiekt” nie zawiera definicji „tytułu” **
mimo że znajduje się w obiekcie dynamicznym.
- o.Title „o.Title” zgłosił wyjątek typu „Microsoft.CSharp.RuntimeBinder.RuntimeBinderException” dynamiczny {Microsoft.CSharp.RuntimeBinder.RuntimeBinderException}
Oto zrzut ekranu:
Robię coś takiego i próbuję wywołać funkcję filmu z projektu testowego.
c#
.net
dynamic
dynamicobject
eiu165
źródło
źródło
Odpowiedzi:
Musisz użyć ExpandoObject
dynamic o = new ExpandoObject(); o.Title = "Ghostbusters"; o.Rating = "PG"; Console.WriteLine(m.PrintMovie(o));
źródło
Odpowiedź Jahamala nie mówi, dlaczego otrzymujesz błąd. Powodem jest to, że klasa anonimowa jest przypisana
internal
do zestawu. Słowo kluczowedynamic
nie pozwala na ominięcie widoczności członków.Rozwiązaniem jest zastąpienie anonimowej klasy nazwaną klasą publiczną.
Oto kolejny dobry przykład wyjaśniający przyczynę i inne możliwe rozwiązanie .
źródło
dynamic
można sprawdzić w klasie testowej z członkami o różnej widoczności.W moim przypadku miałem projekt testów jednostkowych, który stworzyłem w Visual Studio i wiele przypadków, w których musiałem przetestować metody w bibliotece warstwy danych. Nie chciałem zmieniać ich wszystkich, więc oznaczyłem montaż testowy jako przyjaciel, używając:
[assembly:InternalsVisibleTo("MyDataLayerAssemblyName")]
I to rozwiązało problem.
Przykład:
using System.Runtime.CompilerServices; using Microsoft.VisualStudio.TestTools.UnitTesting; [assembly: InternalsVisibleTo( "MyDataLayerAssembly" )] namespace MyUnitTestProject.DataTests { [TestClass] public class ContactTests { ...
Bibliografia:
źródło
W moim przypadku mam projekt testowy xUnit.
Gdzie „content” to ciąg json .
Ten kod zgłasza błąd:
dynamic parsed = JsonConvert.DeserializeObject<dynamic>(content);
Ten kod działa. Użyj ExpandoObject zamiast dynamiki w następujący sposób:
dynamic parsed = JsonConvert.DeserializeObject<ExpandoObject>(content);
źródło