Saya mendapatkan pesan kesalahan yang mengatakan:
'object' tidak mengandung definisi untuk 'Title'
semua kode juga ada di github
Saya memiliki ConsoleApplication1 yang terlihat seperti ini
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));
}
}
}
dan Movie.cs
public class Movie : DynamicObject
{
public string PrintMovie(dynamic o)
{
return string.Format("Title={0} Rating={1}", o.Title, o.Rating);
}
}
ini berfungsi dengan baik dari proyek yang SAMA, tetapi jika saya menambahkan ConsoleApplication2 dengan referensi ke ConsoleApplication1 dan menambahkan kode yang sama persis
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));
}
}
}
Saya mendapatkan kesalahan:
'object' tidak mengandung definisi untuk 'Title' **
meskipun itu dalam objek dinamis.
- o.Title 'o.Title' melontarkan pengecualian jenis 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' dynamic {Microsoft.CSharp.RuntimeBinder.RuntimeBinderException}
Ini tangkapan layarnya:
Saya melakukan sesuatu seperti ini dan mencoba memanggil fungsi film dari proyek uji.
c#
.net
dynamic
dynamicobject
eiu165
sumber
sumber
Jawaban:
Anda perlu menggunakan ExpandoObject
dynamic o = new ExpandoObject(); o.Title = "Ghostbusters"; o.Rating = "PG"; Console.WriteLine(m.PrintMovie(o));
sumber
Jawaban Jahamal tidak menjelaskan mengapa Anda mendapatkan kesalahan tersebut. Alasannya adalah bahwa kelas anonim
internal
ke majelis. Kata kuncidynamic
tidak memungkinkan Anda untuk melewati visibilitas anggota.Solusinya adalah mengganti kelas anonim dengan kelas publik bernama.
Berikut contoh bagus lainnya yang menjelaskan alasan dan kemungkinan solusi lain .
sumber
dynamic
dapat diperiksa pada kelas tes dengan anggota yang memiliki visibilitas yang berbeda-beda.Dalam kasus saya, saya memiliki proyek Unit Test yang saya buat di Visual Studio dan banyak kasus di mana saya perlu menguji metode pada pustaka lapisan data. Saya tidak ingin mengubah semuanya, jadi saya menandai perakitan uji sebagai teman dengan menggunakan:
[assembly:InternalsVisibleTo("MyDataLayerAssemblyName")]
Dan itu menyelesaikannya.
Contoh:
using System.Runtime.CompilerServices; using Microsoft.VisualStudio.TestTools.UnitTesting; [assembly: InternalsVisibleTo( "MyDataLayerAssembly" )] namespace MyUnitTestProject.DataTests { [TestClass] public class ContactTests { ...
Referensi:
sumber
Dalam kasus saya, saya memiliki proyek uji xUnit.
Di mana 'konten' adalah string json .
Kode ini melempar kesalahan:
dynamic parsed = JsonConvert.DeserializeObject<dynamic>(content);
Kode ini berfungsi. Gunakan ExpandoObject insted dinamis seperti ini:
dynamic parsed = JsonConvert.DeserializeObject<ExpandoObject>(content);
sumber