B\S备忘录21——使用反射将委托挂钩

  上上篇博客,写了我用反射实现动态配置业务的过程,其中有一个方法是关键点,CreateDelegate。

  以前使用委托的时候都是使用把方法绑定给委托的方式,来使用。这次是需要使用MethodInfo这个类型来绑定委托,查的资料还是MSDN比较详细。

  这个CreateDelegate一共有。。。好多个重载,我用的只是其中一种:使用指定的对象创建指定类型的委托,该委托表示指定的方法。

  这里我是用的是MSDN上的第二个重载,Delegate.CreateDelegate(Type,Object,MethodInfo),三个参数分别是,要创建的委托的类型

public delegate void Caller();

public static void Demo()
{
    //获得MyMethod方法信息
    MethodInfo minfo = typeof(Derived).GetMethod("MyMethod");
    //创建委托并且绑定到Caller委托类型的对象上
    Caller ex =(Caller)Delegate.CreateDelegate(typeof(Caller),null, minfo);
}
  这样就创建成功一个委托,并且不需要知道MyMethod方法的具体信息。要是通过反射来获得MethodInfo的话,上上篇博客中已经写到了,这里就不再写一遍了。

  如果是正常情况下,我这种创建委托的方式,CreateDelegate的第二个参数可以不写的,本身我们就有一个委托的对象来接受创建出来的委托,并不需要null这个参数先绑定一个空值,再绑定到ex对象上,这样的效率反而低了。但是我在工作流系统中出现了一个错误。

  无法绑定到目标方法,因其签名或安全透明度与委托类型的签名或安全透明度不兼容。

  后来解决这个问题就是写成现在这个样子,我后来找到了原因,委托类型的声明,与创建委托的过程,这两段代码是在两个系统中写的,所以出现了签名不一致的情况,网上给出的解决方案是这样的。

  在“解决方案资源管理器”中选定一个项目,然后在“项目”菜单中单击“属性”。

  在“项目设计器”中,单击“安全”选项卡。

  选择“启用 ClickOnce安全设置”复选框,然后单击“这是不完全可信的应用程序”选项按钮。

  单击“高级”按钮。

  选择“使用选定权限集调试此应用程序”复选框,然后单击“确定”。

  但是我这里并没有找到安全选项卡,所以就只能用这样的低效率方案了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
实验目的: 1. 了解SQLite数据库的基本概念和使用方法 2. 掌握Android Studio中SQLite数据库的操作方法 3. 能够使用SQLite数据库存储数据并读取数据 实验步骤: 1. 新建一个Android Studio项目,并创建一个空白Activity。 2. 在项目的build.gradle文件中添加依赖项:implementation 'com.android.support:support-core-utils:28.0.0',用于支持SQLite数据库的操作。 3. 在布局文件中添加一个EditText和两个Button,分别用于输入备忘录内容、保存备忘录和读取备忘录。 4. 在Activity中定义一个SQLiteOpenHelper类,用于创建和更新数据库。 5. 在Activity中定义一个SQLiteOpenHelper对象和一个SQLiteDatabase对象,用于操作数据库。 6. 在Activity的onCreate()方法中,通过SQLiteOpenHelper对象创建或打开数据库,并创建一个备忘录表。 7. 在保存备忘录按钮的点击事件处理方法中,将EditText中的内容插入到备忘录表中。 8. 在读取备忘录按钮的点击事件处理方法中,查询备忘录表中的所有数据,并在EditText中显示。 实验代码: ```java public class MemoActivity extends AppCompatActivity { private EditText mMemoEditText; private Button mSaveButton; private Button mLoadButton; private MemoDbHelper mDbHelper; private SQLiteDatabase mDb; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_memo); mMemoEditText = findViewById(R.id.memo_edit_text); mSaveButton = findViewById(R.id.save_button); mLoadButton = findViewById(R.id.load_button); mDbHelper = new MemoDbHelper(this); mDb = mDbHelper.getWritableDatabase(); mDb.execSQL(MemoContract.MemoEntry.SQL_CREATE_ENTRIES); } public void onSaveButtonClick(View view) { ContentValues values = new ContentValues(); values.put(MemoContract.MemoEntry.COLUMN_NAME_CONTENT, mMemoEditText.getText().toString()); mDb.insert(MemoContract.MemoEntry.TABLE_NAME, null, values); Toast.makeText(this, "Saved", Toast.LENGTH_SHORT).show(); } public void onLoadButtonClick(View view) { Cursor cursor = mDb.query( MemoContract.MemoEntry.TABLE_NAME, null, null, null, null, null, null ); StringBuilder builder = new StringBuilder(); while (cursor.moveToNext()) { String content = cursor.getString(cursor.getColumnIndexOrThrow(MemoContract.MemoEntry.COLUMN_NAME_CONTENT)); builder.append(content); builder.append("\n"); } mMemoEditText.setText(builder.toString()); } private static class MemoDbHelper extends SQLiteOpenHelper { public static final int DATABASE_VERSION = 1; public static final String DATABASE_NAME = "Memo.db"; public MemoDbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(MemoContract.MemoEntry.SQL_CREATE_ENTRIES); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL(MemoContract.MemoEntry.SQL_DELETE_ENTRIES); onCreate(db); } } } ``` 实验结果: 经过实验,可以成功地使用SQLite数据库存储备忘录数据,并且能够读取备忘录数据并在EditText中显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值