将Java.Lang.Object转换为.net类型

时间:2011-09-02 13:05:40

标签: casting xamarin.android

我正在尝试将一个spinner.SelectedItem强制转换为monodroid中的字符串。 由于SelectedItem是一个Java.Lang.Object,我需要知道如何将Java.Lang.Object转换为本机.net类型。 谢谢, 亚历

3 个答案:

答案 0 :(得分:5)

你没有为你绑定到微调器的内容提供任何上下文,但我假设它只是一个字符串列表?如果是这种情况,一种可能性就是做

spinner.SelectedItem.ToString()

如果底层对象不是字符串,那将不会非常有用。您还有其他一些选择。您可以使用spinner.SelectedItemPosition从spinner适配器的源中获取该项。类似的东西:

var source = new List<string> { "a", "b", "c" };
spinner.Adapter = new ArrayAdapter<string>(this, Resource.Layout.Item, Resource.Id.Name, source);
var selectedString = source[spinner.SelectedItemPosition];

你也可以这样做:

var selectedString = spinner.GetItemAtPosition[spinner.SelectedItemPosition].ToString();

这一切都取决于你想要做什么以及什么时候做。 Xamarin有一个tutorial up here,它介绍了使用微调器的基础知识。

答案 1 :(得分:0)

http://docs.xamarin.com/android/advanced_topics/architecture

这是Xaramin的Mono运行时架构文档的链接, 这不是直接回答java到.net“cast”的问题,它是 当然是一个起点(我站在自己的搜索和 生产解决方案)。

如果/当我想出某些东西时,我会发布任何有用的东西。

答案 2 :(得分:0)

我有类似的问题;特别是因为我有一个DataLayer PCL,我想在各种平台之间共享。而且我不想每次将我的DataLayer对象转换为Java对象或IOS对象等......

因此,对于Android解决方案,这个Wrapper / Decorator模式运行良好;

  1. 想象一下,你有你的PCL对象

    public class GoldList
    {
        public string UniqueId { get; set; }
        public string Name { get; set; }
        public string Owner { get; set; }
    
        public GoldList()
        {
        }
    }
    
  2. 创建一个继承自Java.Lang.Object的IJavaWrapper接口和JavaWrapper对象:

    public abstract class JavaWrapper<T> : Java.Lang.Object, IJavaWrapper
    {
        private readonly T _item;
    
        protected JavaWrapper(T item)
        {
            _item = item;
        }
    
        public T Item
        {
            get { return _item; }
        }
    
        object IJavaWrapper.Item
        {
            get { return _item; }
        }
    }
    
    public interface IJavaWrapper
    {
        object Item { get; }
    }
    
  3. 创建一个具体的实例;包装数据对象

    class GoldListJO : JavaWrapper<GoldList>
    {
        public GoldListJO() : this(new GoldList())
        {
        }
    
        public GoldListJO(GoldList item) : base(item)
        {
        }
    }
    
  4. 绑定到项目(使用示例代码):

    List<GoldListJO> items = new List<GoldListJO>();
    items.Add(new GoldListJO(new GoldList { Name = "1", UniqueId = "U1", Owner = "O1" }));
    items.Add(new GoldListJO(new GoldList { Name = "2", UniqueId = "U2", Owner = "O2" }));
    items.Add(new GoldListJO(new GoldList { Name = "3", UniqueId = "U3", Owner = "O3" }));
    list.SetAdapter(new GoldListAdapter(items));
    
  5. 当你调用“GetItem”并返回一个Java.Lang.Object时没问题,只需引用.Item:

    GoldListJO item = (GoldListJO)GetItem(position);
    
    vh.txtName.Text = item.Item.Name;
    vh.txtUniqueId.Text = Java.Lang.String.Format("UniqueId: %s", item.Item.UniqueId);
    vh.txtOwner.Text = Java.Lang.String.Format("Owner: %s", item.Item.Owner);