C#で動的なキーワードの種類メソッドの呼び出しを使用した場合の問題のすべての種類は、あなたが発生する可能性があります

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/WPwalter/article/details/102634877

あなたは使用することができdynamic、あなたは、あなたがこのタイプのすべてのプロパティとメソッドとして最初から知っていたと同じように、インスタンスのさまざまなメソッドを呼び出すように、弱い型付けされた言語のようにすることができ、変数やフィールドを定義します。

しかし、不適切な使用は、様々な問題が発生します、あなたはもちろんのこのコレクションを発生する可能性のある問題のすべての種類は、あなたがそれらを取り除くのに役立ちます。


はじめに

dynamic それは使用することができます。

dynamic foo = GetSomeInstance();
foo.Run("欢迎访问吕毅(lvyi)的博客:blog.walterlv.com");

object GetSomeInstance()
{
    return 诡异的东西;
}

我々はGetSomeInstance明らかに返しobject、私たちは、実際のクラスのメソッドを呼び出すことができています。

次に、あなたは約使うdynamic発生する可能性のある問題と解決方法。

コンパイルエラー:見つからないコンパイラに必要なメンバー

あなたが最初のプロジェクトで導入されたdynamicキーワードの後に、コンパイルエラーがあることを示唆し、発生した「コンパイラの欠如はメンバーを必要とします。」

エラーCS0656は:コンパイラの欠如は、そのメンバー「Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create」が必要

.NET Coreまたは.NET標準のプロジェクトのために

NuGetは、あなたのプロジェクトのために、次の二つのパッケージをインストールする必要があります。

2つのNuGetパッケージを参照してください。

以上の2つの参照となりますので、あなたのプロジェクト:

    <Project Sdk="Microsoft.NET.Sdk">

      <PropertyGroup>
        <TargetFrameworks>netstandard2.0;net48</TargetFrameworks>
      </PropertyGroup>

      <ItemGroup>
++      <PackageReference Include="Microsoft.CSharp" Version="4.5.0" />
++      <PackageReference Include="System.Dynamic.Runtime" Version="4.3.0" />
      </ItemGroup>

    </Project>

.NET Frameworkのプロジェクトのために

あなたは、参照する必要がありますMicrosoft.CSharp

参照の追加

参考Microsoft.CSharp

引用のよりとなりますので、あなたのプロジェクト:

    <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

      <PropertyGroup>
        <TargetFramework>net48</TargetFramework>
      </PropertyGroup>

      <ItemGroup>
++      <Reference Include="Microsoft.CSharp" />
      </ItemGroup>

    </Project>

例外:「{0}」が含まれていない「{1}」のように定義されます

{0} 是类型名称,而 {1} 是使用 dynamic 访问的属性或者方法的名称。

比如,我试图从某个 Attribute 中访问到 Key 属性的时候会抛出以下异常:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:““System.Attribute”未包含“Key”的定义”

出现此异常的原因是:

  • dynamic 所引用的对象里面,没有签名相同的 public 的属性或者方法

于是,如果你确认你的类型里面是有这个属性或者方法的话,那么就需要注意需要将此成员改成 public 才可以访问。


参考资料


我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

クリエイティブコモンズライセンス

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

おすすめ

転載: blog.csdn.net/WPwalter/article/details/102634877